【问题标题】:Cannot respond with XML in spring春季无法使用 XML 响应
【发布时间】:2015-10-05 20:30:36
【问题描述】:

我们目前有一个响应 json 的 Spring App。我们也在尝试支持 xml 响应。目前,控制器方法看起来像

@RequestMapping(value = URIConstants.POSTS, method = RequestMethod.POST, produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE })
public @ResponseBody RestResponse<PostResponse> getItems(@RequestBody Request request, HttpServletRequest httpRequest) throws Exception {

  // do stuff
}

我们在服务器配置 xml 中添加了以下内容:

<bean id="contentNegotiationManager"
         class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="true"/>
    <property name="ignoreAcceptHeader" value="true" />
    <property name="useJaf" value="false"/>
    <property name="defaultContentType" value="application/json" />
    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json" />
            <entry key="xml" value="application/xml" />
        </map>
    </property>
</bean>

这是完整的配置文件:

<bean id="contentNegotiationManager"
         class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="true"/>
    <property name="ignoreAcceptHeader" value="true" />
    <property name="useJaf" value="false"/>
    <property name="defaultContentType" value="application/json" />
    <property name="mediaTypes">
        <map>
            <entry key="json" value="application/json" />
            <entry key="xml" value="application/xml" />
        </map>
    </property>
</bean>

<bean id="spurJSONMapper"  class="com.ct.app.utilities.SpurJSONMapper"/>

<mvc:interceptors>
    <ref bean="interceptor"/>
</mvc:interceptors>

<bean id="interceptor" 
            class="com.ct.app.controller.RequestInterceptor">
</bean>


  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/view/"/>
  <property name="suffix" value=".jsp"/>
 </bean>

   <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMapping HandlerAdapter">
   <property name="messageConverters">
      <list>
          <ref bean="jsonMessageConverter"/>

      </list>
   </property>
</bean>


<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
 </bean>

当我们请求资源时,我们得到以下响应:“服务器拒绝此请求,因为请求实体的格式不受所请求方法的请求资源支持。”

不确定配置中的漏洞在哪里,感谢任何帮助。

【问题讨论】:

    标签: java xml spring spring-mvc


    【解决方案1】:

    如果您打算读写 XML,则需要使用 org.springframework.oxm 包中的特定 MarshallerUnmarshaller 实现配置 MarshallingHttpMessageConverter

    更新您的 XML 以在下面考虑

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <util:list id="beanList">
                <ref bean="stringHttpMessageConverter"/>
                <ref bean="marshallingHttpMessageConverter"/>
            </util:list>
        </property
    </bean>
    
    <bean id="stringHttpMessageConverter"
            class="org.springframework.http.converter.StringHttpMessageConverter"/>
    
    <bean id="marshallingHttpMessageConverter"
            class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
        <property name="marshaller" ref="castorMarshaller" />
        <property name="unmarshaller" ref="castorMarshaller" />
    </bean>
    
    <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller"/>
    

    所以,你更新后的配置应该是这样的(我很快更新了,所以请仔细检查一次

    <bean id="contentNegotiationManager"
             class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <property name="favorPathExtension" value="true"/>
        <property name="ignoreAcceptHeader" value="true" />
        <property name="useJaf" value="false"/>
        <property name="defaultContentType" value="application/json" />
        <property name="mediaTypes">
            <map>
                <entry key="json" value="application/json" />
                <entry key="xml" value="application/xml" />
            </map>
        </property>
    </bean>
    
    <bean id="spurJSONMapper"  class="com.ct.app.utilities.SpurJSONMapper"/>
    
    <mvc:interceptors>
        <ref bean="interceptor"/>
    </mvc:interceptors>
    
    <bean id="interceptor" 
                class="com.ct.app.controller.RequestInterceptor">
    </bean>
    
    
      <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/view/"/>
      <property name="suffix" value=".jsp"/>
     </bean>
    
       <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
       <property name="messageConverters">
          <list>
              <ref bean="jsonMessageConverter"/>
              <ref bean="marshallingHttpMessageConverter"/>
              <ref bean="stringHttpMessageConverter"/>
          </list>
       </property>
    </bean>
    
    <bean id="stringHttpMessageConverter"
            class="org.springframework.http.converter.StringHttpMessageConverter"/>
    
    <bean id="marshallingHttpMessageConverter"
            class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
        <property name="marshaller" ref="castorMarshaller" />
        <property name="unmarshaller" ref="castorMarshaller" />
    </bean>
    
    <bean id="castorMarshaller" class="org.springframework.oxm.castor.CastorMarshaller"/>
    
    <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
     </bean>
    

    阅读更多here

    附带说明,对于CastorMarshaller,您必须拥有spring-oxm-x.x.x.RELEASE.jar JAR,我想您应该已经拥有了。

    【讨论】:

    • 谢谢!这让我完成了 99% 的工作。我还必须为我的所有类添加注释,以便将它们转换为 xml。
    猜你喜欢
    • 1970-01-01
    • 2019-10-21
    • 2019-09-21
    • 2019-02-09
    • 2015-08-31
    • 2017-06-19
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多