Я пишу небольшую программу 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
клиент. Я добавлю сообщение об ошибке сервера.
Почему вы отправляете только map на обе конечные точки? Почему бы не использовать map2 для http://localhost:8080/char2.
изменен. та же ошибка.
Я не знаю, что такое restTemplate, поэтому не могу проводить собственные тесты. Однако помните, что REST - это HTTP-связь, а не Java-связь. Есть множество способов интерпретировать что-либо как одномерный массив в HTTP, но ничего как двумерный массив. Попытки сделать это неизбежно будут странными и, скорее всего, не смогут понять друг друга.
restTemplate взят из Spring Boot.
Ой. Верно. Я сделаю тесты
Попробуйте public String hello(@RequestBody char[][] c).
На стороне сервера есть предупреждение. Устранено [org.springframework.web.HttpMediaTypeNotSupportedException: тип содержимого 'multipart / form-data; charset = UTF-8; Border = kqQKbdMkoVtO0RD1 lvgeTMQbY4wyWNNsiM7' не поддерживается]. На стороне клиента он сообщает: Вызвано: org.springframework.web.client.HttpClientErrorException: 415 null




Вы передаете карту вместо массивов, содержащихся в карте. Попробуйте изменить вызовы отдыха следующим образом:
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
Сообщение об ошибке на стороне сервера или на стороне клиента?