2012-01-17 3 views
1

У меня есть несколько служб REST, которые в настоящее время возвращают форматированные объекты JSON в качестве тел ответа службы. Я пытаюсь сделать эту службу также принятой XML как новое требование, хотя она не принимает этого.Spring REST XML-служба, не принимающая XML как заголовок «accept»

Я следую за spring-mvc-showcase sample project и установил мои зависимости pom.xml почти одинаково, мои сервисные определения также очень просты.

@Controller 
@RequestMapping(value = "api/sales/*") 
public class SalesController { 

    @RequestMapping(value = "/countries", method = RequestMethod.GET) 
    @ResponseBody 
    public List<NamedEntity> getCountries() { 

NamedEntity имеет соответствующий @XmlRootElement аннотацию.

Может кто-нибудь объяснить самые основные требования, которые мне потребуются, чтобы получить XML как ResponseBody, который использует spring-mvc-showcase sample project.

EDIT: Добавлен образец весны MVC.

образец из весенне-MVC-витрина выглядит следующим образом:

package org.springframework.samples.mvc.messageconverters; 

@Controller 
@RequestMapping("messageconverters/*") 
public class MessageConvertersController { 

    @RequestMapping(value="/xml", method=RequestMethod.GET) 
    public @ResponseBody JavaBean writeXml() { 
     return new JavaBean("bar", "fruit"); 

ответ

0

Добавить @Produces ("приложения/XML") в getCountries()

+0

Это не похоже на работу, образцы, указанные делать также не имеют эту аннотацию, я буду обновлять свой пост, чтобы показать контроллер образца с весны. –

1

Проверьте заголовок запроса, клиент должен иметь «application/xml» в заголовке, а не «application/json»

Убедившись, что вы зарегистрировали соответствующий конвертер сообщений для своего объекта. Если вы используете Java 6, Spring автоматически определит JAXB в вашем пути к классам, иначе вы можете вручную добавить конвертер.

+0

Клиент имеет правильное предложение accept' application/application + xml, я использовал JDK7, но рефакторизовался и переключился на JDK6, но все еще не работал. Я также добавил jaxb для моего POM без везения, моя линия вызова curl - «curl -H» Accept: application/application + xml «-X GET» http: // localhost: 8080/fsweb/app/api/sales/страны, которые используют одни и те же «Accept» для проекта весеннего образца. –

0

Вам необходимо отправить «application/xml», а не «application/application + xml». Также рассмотрите возможность использования:

@RequestMapping(value = "/countries", method = RequestMethod.GET, produces={"application/json", "application/xml"}) 

Это гарантирует, что ваш метод реагирует только на эти типы носителей и отклоняет других с кодом статуса HTTP 406.

0

попробуйте эту конфигурацию сервлета диспетчера.

<mvc:annotation-driven 
     content-negotiation-manager="contentManager" /> 

<bean id="contentManager" 
     class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
     <property name="favorPathExtension" value="false" /> 
     <property name="ignoreAcceptHeader" value="false" /> 
     <property name="defaultContentType" value="application/json" /> 
     <property name="useJaf" value="false" /> 
    </bean> 

и некоторая зависимость

<dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-core</artifactId> 
      <version>2.4.3</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
      <version>2.4.3</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-annotations</artifactId> 
      <version>2.4.3</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.dataformat</groupId> 
      <artifactId>jackson-dataformat-xml</artifactId> 
      <version>2.4.3</version> 
     </dependency> 
Смежные вопросы