Java: передача двумерного массива в службе REST

Я пишу небольшую программу Java REST. Я могу передать одномерный массив, но не могу передать двухмерный массив в качестве параметра. В приведенном ниже коде используется Spring Boot.

код сервера:

@RequestMapping("/char2")
public String hello(char[][] c) {
    return "hello "+c[0][1];
}

@RequestMapping("/char")
public String helloInt(char[] c) {
    return "hello "+c[1];
}

код клиента:

// this works fine
MultiValueMap<String, char[]> map = new LinkedMultiValueMap<String, char[]>();
map.add("c", new char[] {'b','c'});
String s = restTemplate.postForObject("http://localhost:8080/char", map, String.class);
System.out.println(s);

// this does not work
MultiValueMap<String, char[][]> map2 = new LinkedMultiValueMap<String, char[][]>();
map2.add("c", new char[][] {{'a','b'},{'c','d'}});
String s2 = restTemplate.postForObject("http://localhost:8080/char2", map2, String.class);
System.out.println(s2);

сообщение об ошибке клиента:

Caused by: org.springframework.web.client.HttpServerErrorException: 500 null
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:97) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:730) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:688) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:644) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:399) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at hello.Application.lambda$0(Application.java:40) [classes/:na]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:818) [spring-boot-2.0.5.RELEASE.jar:2.0.5.RELEASE]
... 5 common frames omitted

сообщение об ошибке на стороне сервера:

java.lang.NoSuchMethodException: [[C.<init>()
at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_161]
at java.lang.Class.getDeclaredConstructor(Class.java:2178) ~[na:1.8.0_161]
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:208) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
at 

Сообщение об ошибке на стороне сервера или на стороне клиента?

NiVeR 26.09.2018 17:45

клиент. Я добавлю сообщение об ошибке сервера.

Chenxi 26.09.2018 17:47

Почему вы отправляете только map на обе конечные точки? Почему бы не использовать map2 для http://localhost:8080/char2.

dbl 26.09.2018 17:53

изменен. та же ошибка.

Chenxi 26.09.2018 17:57

Я не знаю, что такое restTemplate, поэтому не могу проводить собственные тесты. Однако помните, что REST - это HTTP-связь, а не Java-связь. Есть множество способов интерпретировать что-либо как одномерный массив в HTTP, но ничего как двумерный массив. Попытки сделать это неизбежно будут странными и, скорее всего, не смогут понять друг друга.

kumesana 26.09.2018 18:05

restTemplate взят из Spring Boot.

Chenxi 26.09.2018 18:15

Ой. Верно. Я сделаю тесты

kumesana 26.09.2018 18:17

Попробуйте public String hello(@RequestBody char[][] c).

DodgyCodeException 26.09.2018 18:24

На стороне сервера есть предупреждение. Устранено [org.springframework.web.HttpMediaTypeNotSupportedException: тип содержимого 'multipart / form-data; charset = UTF-8; Border = kqQKbdMkoVtO0RD1‌ lvgeTMQbY4wyWNNsiM7' не поддерживается]. На стороне клиента он сообщает: Вызвано: org.springframework.web.client.HttpClientErrorException: 415 null

Chenxi 26.09.2018 18:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
9
1 010
1

Ответы 1

Вы передаете карту вместо массивов, содержащихся в карте. Попробуйте изменить вызовы отдыха следующим образом:

String s = restTemplate.postForObject("http://localhost:8080/char", map.get("c"), String.class);

String s2 = restTemplate.postForObject("http://localhost:8080/char2", map2.get("c"), String.class);

ошибка на стороне сервера: [org.springframework.http.converter.HttpMessageNotReadableEx‌ параметр: ошибка синтаксического анализа JSON: невозможно преобразовать строку JSON длиной 2 в элемент char массива char; вложенное исключение - com.fasterxml.jackson.databind.exc.MismatchedInputException: невозможно преобразовать строку JSON длиной 2 в элемент char массива char

Chenxi 26.09.2018 19:35

Другие вопросы по теме