cyr*_*mas 6 rest spring-mvc content-negotiation spring-boot
我试图@RestController在json和xml之间格式化我的响应内容类型.它似乎适用于Accept标头或路径扩展(.json,.xml)的情况.我的应用程序打包为WAR并部署到tomcat实例.但是我目前面临着两个问题.
1)即使我ContentNegotiationConfigurer根据curl -X GET -H "Cache-Control: no-cache" http://localhost:8080/v1/api/version解析为XML 的请求将我的默认内容类型设置为JSON
2)当我在请求中使用param时,内容解析不正确.在访问时curl -X GET -H "Cache-Control: no-cache" http://localhost:8080/v1/api/version?format=json我得到了XML.
SpringBoot应用程序
@EnableAutoConfiguration
@ComponentScan
@Configuration
@EnableWebMvc
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
builder.sources(Application.class);
return super.configure(builder);
}
}
Run Code Online (Sandbox Code Playgroud)
WebMvcConfigurerAdapter
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
private RequestMappingHandlerAdapter requestMappingHandlerAdapter;
private CustomObjectMapper objectMapper;
@PostConstruct
public void init() {
List<HttpMessageConverter<?>> messageConverters = requestMappingHandlerAdapter.getMessageConverters();
for (HttpMessageConverter<?> messageConverter : messageConverters) {
if (messageConverter instanceof MappingJackson2HttpMessageConverter) {
MappingJackson2HttpMessageConverter m = (MappingJackson2HttpMessageConverter) messageConverter;
m.setObjectMapper(objectMapper);
}
}
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer
.defaultContentType(MediaType.APPLICATION_JSON)
.favorParameter(true)
.useJaf(false)
.mediaType("xml", MediaType.APPLICATION_XML)
.mediaType("json", MediaType.APPLICATION_JSON);
super.configureContentNegotiation(configurer);
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(mappingJackson2HttpMessageConverter);
converters.add(createXmlHttpMessageConverter());
super.configureMessageConverters(converters);
}
private HttpMessageConverter<Object> createXmlHttpMessageConverter() {
MarshallingHttpMessageConverter xmlConverter =
new MarshallingHttpMessageConverter();
XStreamMarshaller xstreamMarshaller = new XStreamMarshaller();
xmlConverter.setMarshaller(xstreamMarshaller);
xmlConverter.setUnmarshaller(xstreamMarshaller);
return xmlConverter;
}
@Autowired
public void setRequestMappingHandlerAdapter(RequestMappingHandlerAdapter requestMappingHandlerAdapter) {
this.requestMappingHandlerAdapter = requestMappingHandlerAdapter;
}
@Autowired
public void setObjectMapper(CustomObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
}
Run Code Online (Sandbox Code Playgroud)
休息控制器
@RestController
@RequestMapping("/v1/api")
public class RestVersionController {
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/version", method = RequestMethod.GET)
public
@ResponseBody
ApiVersion getVersion() {
return new ApiVersion(1);
}
@JsonIgnoreProperties(ignoreUnknown = true)
@XmlRootElement
public static class ApiVersion {
int version;
String currentVersion = "Current version is ";
public ApiVersion() {
}
public ApiVersion(int version) {
this.version = version;
this.currentVersion = this.currentVersion + version;
}
public ApiVersion(int version, String currentVersion) {
this.version = version;
this.currentVersion = currentVersion;
}
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
public String getCurrentVersion() {
return currentVersion;
}
public void setCurrentVersion(String currentVersion) {
this.currentVersion = currentVersion;
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码@ Github示例
任何帮助表示赞赏,谢谢!
| 归档时间: |
|
| 查看次数: |
1194 次 |
| 最近记录: |