Spring MVC REST默认生成XML

时间:2013-12-05 08:11:24

标签: spring spring-mvc spring-restcontroller

我遇到了Spring MVC和REST的问题。问题是,当我发布没有扩展名的网址或其他任何扩展名,然后json或html或htm我总是得到一个xml响应。但我希望它默认为text / html响应。我正在搜索许多主题,无法找到这个问题。

这是我的Controller类:

@RequestMapping(value="/user/{username}", method=RequestMethod.GET)
public String showUserDetails(@PathVariable String username, Model model){
    model.addAttribute(userManager.getUser(username));
    return "userDetails";
}

@RequestMapping(value = "/user/{username}", method = RequestMethod.GET,   
        produces={"application/xml", "application/json"})  
@ResponseStatus(HttpStatus.OK)
public @ResponseBody 
    User getUser(@PathVariable String username) {
    return userManager.getUser(username);
}

这是我的mvc上下文配置:     

<mvc:resources mapping="/resources/**"
    location="/resources/"/>

<context:component-scan
    base-package="com.chodak.controller" />


    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="defaultContentType" value="text/html" />  
    <property name="mediaTypes">
       <map>
         <entry key="json" value="application/json"/>
         <entry key="xml" value="application/xml"/>
       </map>
     </property>

   </bean>

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass">
        <value>
            org.springframework.web.servlet.view.tiles3.TilesView
        </value>
    </property>
</bean>
<bean id="tilesConfigurer"
    class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/tiles.xml</value>
        </list>
    </property>
</bean>

实际上,当我尝试使用内置的Eclipse浏览器时,它工作正常,但是当我使用firefox或chrome时,它会在没有扩展名的请求上显示xml响应。我尝试使用ignoreAcceptHeader,但没有改变。

也适用于IE:/

如果有人有想法,请帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

我实际上发现了如何做到这一点,我真的不明白为什么但它现在正在工作,我在内容解析器中添加了默认视图,如:

<property name="defaultViews">
    <list>
      <!-- JSON View -->
      <bean
        class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
      </bean>

      <!-- JAXB XML View -->
      <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
        <constructor-arg>
            <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
               <property name="classesToBeBound">
                <list>
                   <value>com.chodak.tx.model.User</value>
                </list>
               </property>
            </bean>
        </constructor-arg>
      </bean>
     </list>
  </property>

并删除了getUser方法,该方法被注释为生成xml和json。如果我使用添加的默认视图保留它仍然无法正常工作。如果有人能解释为什么它会很棒:)

答案 1 :(得分:0)

你可以做到

import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
// @EnableWebMvc already autoconfigured by Spring Boot
public class MvcConfiguration {

@Bean
public WebMvcConfigurer contentNegotiationConfigurer() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
            configurer.favorPathExtension(false)
                    .favorParameter(true)
                    .parameterName("mediaType")
                    .ignoreAcceptHeader(true)
                    .useJaf(false)
                    .defaultContentType(MediaType.APPLICATION_JSON)
                    .mediaType("xml", MediaType.APPLICATION_XML)
                    .mediaType("json", MediaType.APPLICATION_JSON);
            // this line alone gave me xhtml for some reason
            // configurer.defaultContentType(MediaType.APPLICATION_JSON_UTF8);
        }
    };
}

(尝试使用Spring Boot 1.5.x)

请参阅https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc

&#34;在这两种情况下我们做了什么:

  • 已停用路径扩展名。请注意,favour并不意味着使用一种方法优先于另一种方法,它只是启用或禁用它。检查顺序始终是路径扩展,参数,Accept标头。

  • 启用URL参数但不使用默认参数format,而是使用mediaType代替。

  • 完全忽略Accept标题。如果您的大多数客户实际上是Web浏览器(通常通过AJAX进行REST调用),这通常是最好的方法。

  • 不要使用JAF,而是手动指定媒体类型映射 - 我们只希望支持JSON和XML。&#34;