我想返回一个简单的纯文本字符串,如下所示:
@RestController
@RequestMapping("/test")
public class TestController {
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/my", method = RequestMethod.GET, produces="text/plain")
public String test() {
return "OK";
}
问题:我还有一个全局ContentNegotiation过滤器,如下所示:
@Configuration
public class ContentNegotiationAdapter extends WebMvcConfigurerAdapter {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false)
.favorParameter(true)
.ignoreAcceptHeader(true)
.useJaf(false)
.defaultContentType(MediaType.APPLICATION_XML);
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
}
}
结果:每当我访问弹簧控制器时,我都会收到错误:
无法找到可接受的代表
问题:如何强制控制器返回纯文本,即使在内容协商中只配置了XML(我必须保留)?
最佳答案 如果从映射中删除produce =“text / plain”,它将返回纯文本,但标题设置为“application / xml”.这可能是不可取的.
我测试了最新版本的Spring Boot.
如果您使用的是Spring> = 4.1.2版本,则可以尝试使用defaultContentTypeStrategy而不是defaultContentType,以在标头中设置正确的内容类型:
configurer.favorPathExtension(false)
.favorParameter(true)
.ignoreAcceptHeader(true)
.useJaf(false)
.defaultContentTypeStrategy(new ContentNegotiationStrategy() {
@Override
public List<MediaType> resolveMediaTypes(NativeWebRequest nativeWebRequest) throws
HttpMediaTypeNotAcceptableException {
System.out.println("Description:"+nativeWebRequest.getDescription(false));
if (nativeWebRequest.getDescription(false).endsWith("/test/my")) {
return Collections.singletonList(MediaType.TEXT_PLAIN);
}
else {
return Collections.singletonList(MediaType.APPLICATION_XML);
}
}
})
//.defaultContentType(MediaType.APPLICATION_XML)
;