我遇到了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:/
如果有人有想法,请帮助,谢谢。
答案 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;