406 Недопустимо для списка — REST

Я пытаюсь найти способ вместо класса Wrapper, но всегда получаю ошибку 406 Not Acceptable. Я искал в Интернете и пробовал много разных способов, но не мог это исправить.

@RequestMapping(value = "/users/getlist", headers="Accept=application/xml, application/json", method=RequestMethod.POST)
public @ResponseBody List<Permission> getList(@RequestParam String userEmail) {         
    List<Permission> permissions = service.getPermissions(userEmail);

      return permissions;
}

А также

MultiValueMap<String, String> userMap = new LinkedMultiValueMap<String, String>();
userMap.add("userEmail", email_address);

// Prepare acceptable media type
List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
acceptableMediaTypes.add(MediaType.APPLICATION_XML);

// Prepare header
HttpHeaders headers = new HttpHeaders();
headers.setAccept(acceptableMediaTypes);
HttpEntity<?> userEntity = new HttpEntity<Object>(userMap, headers);

List<Permission> permissions = restTemplate.postForObject("http://localhost:8080/users/getlist", userEntity, List.class);

я тоже пробовал;

List<Permission> permissions = (List<Permission>) restTemplate.postForEntity("http://localhost:8080/users/getlist", userEntity, List.class);    

Так что в основном, если я использую класс-оболочку с геттером и сеттером, он работает. Но мне нужно создать много классов-оболочек. У вас есть идея реализовать подобное?

РЕШЕНИЕ:

Сработало добавление медиатипа к объекту http.


person likeachamp    schedule 28.04.2014    source источник


Ответы (1)


я полагаю, что

headers="Accept=application/xml, application/json"

потребуется, чтобы ваш заголовок Accept действительно имел значение application/xml, application/json. В вашем запросе нет.

Вы добавляете один допустимый тип носителя.

List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
acceptableMediaTypes.add(MediaType.APPLICATION_XML);

Это закончится заголовком запроса, например

Accept: application/xml

Что не будет соответствовать объявленному @RequestMapping.

Вместо этого, если вы хотите, чтобы headers соответствовало либо application/xml, либо application/json, вы можете сделать

headers= {"Accept=application/xml", "Accept=application/json"}

или еще лучше

produces = {"application/xml", "application/json"}
person Sotirios Delimanolis    schedule 28.04.2014
comment
Спасибо за твой ответ. Я пробовал производить, но все равно получаю ошибку 406. У вас есть другие предложения? - person likeachamp; 29.04.2014
comment
@user3058742 user3058742 У вас есть Джексон в пути к классам? - person Sotirios Delimanolis; 29.04.2014
comment
У меня есть. Когда это один объект, проблем нет. Со сбором не разобрался. - person likeachamp; 29.04.2014
comment
@ user3058742 Какие версии Spring и Jackson вы используете? попробую воспроизвести. - person Sotirios Delimanolis; 29.04.2014
comment
Spring 4.0.1.RELEASE, jackson 1.9.13 - Спасибо! - person likeachamp; 29.04.2014
comment
@user3058742 user3058742 О, я не знал, что вы пытаетесь использовать XML. Вам нужно будет зарегистрировать пользовательскую Jaxb2CollectionHttpMessageConverter я полагаю. - person Sotirios Delimanolis; 29.04.2014
comment
@user3058742 user3058742 Или подумайте о том, чтобы обернуть List в POJO, аннотированный аннотациями JAXB. - person Sotirios Delimanolis; 29.04.2014
comment
Я не знаю, как это сделать, дайте мне попробовать. Также вы предлагаете какой-либо другой способ, который может быть лучше или проще? - person likeachamp; 29.04.2014
comment
@user3058742 user3058742 Один вариант: stackoverflow.com/questions/7334557/ - person Sotirios Delimanolis; 29.04.2014
comment
Да, я пробовал этот вариант раньше, и он работал. Мне нужно работать со списком во многих местах, поэтому не будет хорошим способом создать новый класс для всех последних классов. В любом случае, у меня не будет другого варианта, если Jaxb2CollectionHttpMessageConverter не работает. Спасибо - person likeachamp; 29.04.2014
comment
@user3058742 user3058742 Обратите внимание, что Jaxb2CollectionHttpMessageConverter сам по себе не работает. Вам нужно будет создать собственный подкласс. - person Sotirios Delimanolis; 29.04.2014
comment
Я думаю, что я пойду с классом-оболочкой. Спасибо :) - person likeachamp; 29.04.2014
comment
Да неужели ! когда я отправляю заголовок типа HttpEntity<?> userEntity = new HttpEntity<Object>(userMap, new HttpHeaders()); без MediaTypes, он работает. У вас есть хорошее объяснение этому, потому что я не понимаю. По сути, то, как я публикую, работает без использования медиатипов. - person likeachamp; 29.04.2014
comment
@user Я считаю, что если вы не отправляете заголовок Accept, принимаются все типы контента. Если вы посмотрите на свой контент, это должен быть JSON. - person Sotirios Delimanolis; 29.04.2014
comment
Да вроде как вы говорите. Благодарю вас ! - person likeachamp; 29.04.2014