2013-12-11 2 views
3

Мы хотели бы создать «WebService», которые возвращают список определенных объектов. И мы хотели бы назвать этот веб-сервис из другой java-программы библиотекой клиентов apache http.Spring MVC @ResponseBody возвращает список

В настоящий момент, если мы вызываем веб-сервис из Firefox, появляется страница ошибки 406.

Нужно ли использовать JSON или XML для переноса списка? Как это сделать и как получить список с apache http-клиентами?

спасибо.


[EDIT]

Единственное, что работает, чтобы создать некоторые объекты с JAXB аннотации, чтобы сериализовать в XML.

@XmlRootElement(name = "person") 
public class Person { 

    private String id; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

} 

@XmlRootElement(name = "persons") 
public class PersonList { 

    @XmlElement(required = true) 
    public List<Person> persons; 

    public List<Person> getData() { 
     return persons; 
    } 

    public void setData(List<Person> persons) { 
     this.persons = persons; 
    } 

} 

@RequestMapping(value = "/hello.html", method = RequestMethod.GET, produces = "application/xml") 
@ResponseBody 
public ResponseEntity<PersonList> hello() { 
    PersonList test = new PersonList(); 

    List<Person> rep = new ArrayList<Person>(); 
    Person person1 = new Person(); 
    person1.setId("1"); 
    Person person2 = new Person(); 
    person2.setId("2"); 

    rep.add(person1); 
    rep.add(person2); 

    test.setData(rep); 
    // return test; 

    HttpHeaders responseHeaders = new HttpHeaders(); 
    List<MediaType> medias = new ArrayList<MediaType>(); 
    medias.add(MediaType.ALL); 
    responseHeaders.setAccept(medias); 
    return new ResponseEntity<PersonList>(test, responseHeaders, HttpStatus.OK); 
} 

Я попытался с производством и вернуться непосредственно к объекту, но по-прежнему ошибки 406. XML + ResponseEntity работает.

Это очень странная причина, по которой я увидел пример, очень простой, когда объект преобразован в json и появляется в веб-браузере.

Итак, теперь я должен понять, как получить ответ и преобразовать XML в субъект ...

+0

Вы действительно прочитали [это] (http://stackoverflow.com/q/14251851/696632)? –

+0

спасибо. я постараюсь в тестовом проекте ... – MychaL

ответ

4

В течение 2 дней, я перепробовал много способов: - responseEntity - httpheaders - XML ​​ и т.д ...

Для JSON (поведение по умолчанию), проекту нужна библиотека со всем Спрингом библиотекой. Здесь библиотека объявляет в проекте Maven.

<dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-mapper-asl</artifactId> 
    <version>1.7.1</version> 
</dependency> 

Без этой библиотеки у меня есть ошибка (406).

Спасибо за все ваши ответы & советов.

1

Вы можете создавать службы REST с использованием Spring MVC рамки. Он вернет JSON/XML. И вызовите эти службы, используя HTTP-клиенты/шаблоны отдыха, и используйте возвращенный JSON для отображения информации.

Весенние контроллеры могут возвращать объект, список объектов. И некоторые сопоставления (Jackson и JAXB) позволят преобразовать объект в JSON/XML.

Если ваши службы принимают данные запроса, вы можете отправить объект для обслуживания и получить данные ответа.

Вы также можете использовать рамки Grails.

10

Да, когда ваш метод контроллера в аннотированном @ResponseBody, Spring преобразует возвращаемые данные в JSON.

4

@ResponseBody автоматически кодирует возвращаемый объект в соответствующие форматы на основе заголовка Accept запроса и наличия библиотек JSON и/или XML в пути к классам.

Может быть проще или безопаснее определить свой собственный объект, чтобы обернуть список, а не возвращать список напрямую, поскольку это дает вам больше контроля над кодировкой, а также позволяет потенциально добавлять другие данные в будущем.

+0

Определенно согласен с комментарием по созданию объекта, обертывающего список. Это лучший способ контролировать то, что генерируется, и обеспечить согласованность как по XML, так и по результатам JSON. – Steve

+0

хорошо, да, это хорошая идея. Я только преуспеваю в передаче XML, не знаю почему. Теперь мне нужно получить ответ ... – MychaL

2

Для этого вам следует использовать ResponseEntity. @ResponseBody не дает вам никакого контроля над ответом.

7

Аннотации @ResponseBody сообщают Spring, что мы будем возвращать данные в корпусе ответа, а не визуализировать JSP.

Когда используется аннотация @ResponseBody, Spring вернет данные в формате, приемлемом для клиента. То есть, если клиентский запрос имеет заголовок для принятия json, а Jackson-Mapper присутствует в пути к классам, то Spring попытается сериализовать возвращаемое значение JSON. Если заголовок запроса указывает XML как приемлемый (accept=application/xml), а Jaxb находится в пути к классам, а тип возвращаемого объекта аннотируется аннотацией Jaxb, Spring попытается вывести возвращаемое значение в XML.

0

На самом деле вам необходимо использовать веб-службу REST, которая несут формат JSON/XML в качестве представления объектов. Я предпочитаю JSON, потому что это очень легкий вес.

Прежде всего, необходимо добавить зависимость в вашем pom.xml

<dependency> 
<groupId>org.codehaus.jackson</groupId> 
<artifactId>jackson-mapper-asl</artifactId> 
<version>1.7.1</version> 

и обработчик метода здесь

@ResponseBody 
    @RequestMapping(value = "/your URL") 
    public ArrayList<Long> getInboxPage(@RequestParam int var,HttpSession session) { 

     ArrayList<Long> fooList=new ArrayList<Long>(); 
     fooList.add(1L); 
     fooList.add(2L); 
     fooList.add(3L); 

     return fooList; 

    } 

Примечание: Spring автоматически делает JSON, если вы пишете @ResponseBody аннотации в обработчике метода вам не нужно добавлять зависимость Джексона в файл pom.xml.

+0

Нет, без библиотеки jackson, это не сработает. Он пытается конвертировать в JSON, но есть ошибка HTTP. С библиотекой, которая реализует JSON-конвертер, все в порядке. – MychaL

+0

org.codehaus.jackson ДЖЕКСОН-картограф-н.у.м. 1.7.1 я уже упомянуть Джексон репозиторий Maven –

+0

Так почему «вам не нужен, чтобы добавить Джексон зависимость в вашем П. xml-файл "? – MychaL

Смежные вопросы