2013-12-12 3 views
-2

Сервер возвращает 406 HTTP-код при XML, но отлично работает в случае JSON. Ниже приведены фрагменты кода и прикрепленные журналы, а также:Spring + BlazeDS + REST XML-ответ

Библиотеки:

BlazeDS 4.0, Spring 3.2, JBoss 7.1.1Final, Maven 3,0

REST MVC контроллер:

@Controller 
@RequestMapping("/contacts") 
public class ContactsController { 

    @RequestMapping(method = RequestMethod.GET,produces= {"application/xml","application/json"}) 
    @ResponseStatus(value=HttpStatus.OK) 
    public @ResponseBody List<Contact> find(@RequestParam(required = false) String searchStr) { 

Конфигурация Весна:

@Configuration 
@EnableWebMvc 
public class Config extends WebMvcConfigurerAdapter { 

    @Override 
    public void configureContentNegotiation(
      ContentNegotiationConfigurer configurer) { 
     configurer.defaultContentType(MediaType.APPLICATION_XML) 
       .mediaType("xml", MediaType.APPLICATION_XML) 
       .mediaType("json", MediaType.APPLICATION_JSON); 

     } 
    } 

конфигурации Spring

<context:component-scan base-package="com.heksa.services" 
    use-default-filters="false"> 
    <context:include-filter expression="org.springframework.stereotype.Controller" 
     type="annotation" /> 
</context:component-scan> 
<bean id="contentNegotiationManager" 
    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
    <property name="defaultContentType" value="application/xml" /> 

    <property name="mediaTypes"> 
     <map> 
      <entry key="json" value="application/json" /> 
      <entry key="xml" value="application/xml" /> 
     </map> 
    </property> 
</bean> 
<bean id="xmlViewer" 
    class="org.springframework.web.servlet.view.xml.MarshallingView"> 
    <constructor-arg> 
     <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
      <property name="classesToBeBound"> 
       <list> 
        <value>com.heksa.bean.Contact</value> 
       </list> 
      </property> 
     </bean> 
    </constructor-arg> 
</bean> 
<mvc:annotation-driven 
    content-negotiation-manager="contentNegotiationManager" /> 

<mvc:default-servlet-handler /> 

<!-- Flex-specific Configuration --> 
<flex:message-broker mapping-order="1"> 
    <flex:mapping pattern="/messagebroker/*" /> 
    <flex:message-service 
     default-channels="my-streaming-amf,my-longpolling-amf,my-polling-amf" /> 
    <flex:secured /> 
</flex:message-broker> 

JBoss Журналы:

14:13:06,228 INFO [org.springframework.oxm.jaxb.Jaxb2Marshaller] (MSC service thread 1-8) Creating JAXBContext with classes to be bound [class com.heksa.bean.Contact] 
14:13:06,241 INFO [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (MSC service thread 1-8) Mapped "{[/contacts],methods=[GET],params=[],headers=[],consumes=[],produces=[application/xml || application/json],custom=[]}" onto public java.util.List<com.heksa.bean.Contact> com.heksa.services.ContactsController.find(java.lang.String) 
14:13:06,241 INFO [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (MSC service thread 1-8) Mapped "{[/contacts/{id}],methods=[DELETE],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public void com.heksa.services.ContactsController.delete(int) 
14:13:06,242 INFO [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (MSC service thread 1-8) Mapped "{[/contacts],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public com.heksa.bean.Contact com.heksa.services.ContactsController.create(com.heksa.bean.Contact) 
14:13:06,296 INFO [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping] (MSC service thread 1-8) Mapped URL path [/**] onto handler 'org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler#0' 
+3

Каков заголовок принимающего клиента в запросе? – Pedantic

+0

Заголовки настроены правильно. Спасибо, что оставили комментарий. Теперь это исправлено. – Phani

ответ

1

Проблема

Проблема, описанная (было бы неплохо, если бы OP задал задание вместо того, чтобы просто описывать проблему) является одним из согласований контента, вызванным несоответствием между заголовком Accept, предоставленным клиентом, и заголовком Content-Type, предоставленным сервером.

Достоверные и/или официальные источники

Сам HTTP спецификации (RFC 2616) является одновременно надежным и официальным.

Section 14.1 описывает Accept заголовок:

Если нет заголовка Accept поле не присутствует, то предполагается, что клиент принимает все типы носителей. Если присутствует поле заголовка Accept, , и если сервер не может отправить ответ, который является приемлемым в соответствии с , в комбинированное значение поля Accept, то сервер ДОЛЖЕН отправить 406 (неприемлемый) ответ.

Section 14.17 описывает заголовок Content-Type.

Решение

Поскольку приложение настраивает application/xml быть тип содержания по умолчанию возвращается, если вы хотите получить ответ в XML вы должны либо утверждать, что ни Accept заголовка не указан в запросе HTTP или утверждающий запрос HTTP содержит HTTP-заголовок

Accept: application/xml

Утверждают ответ HTTP, посланный сервером содержит заголовок HTTP

Content-type: application/xml; charset=utf-8

Вы можете использовать перехватчик трафика, чтобы увидеть именно то, что посылается через провод. Одним из популярных инструментов для этого является Wireshark.

+1

слушайте! красивый ответ – flup

+0

После добавления HttpMessageConverter, как указано выше, он работал нормально. – Phani

-1

После добавления HttpMessageConverters, как показано ниже, в файле SpringConfiguration он работал.

<bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"> 
      <constructor-arg ref="jaxbMarshaller" /> 
      <property name="supportedMediaTypes" value="application/xml" /> 
</bean> 

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
    <property name="classesToBeBound"> 
     <list> 
      <value>com.heksa.bean.Contact</value> 
     </list> 
    </property> 
</bean> 
Смежные вопросы