您获得415状态代码,因为服务器在响应中发送html,而您的客户端需要json。
这可能表示发生了服务器端异常。在这种情况下,应用程序服务器会发回html响应。
你必须使服务器响应json,即使发生了异常,或者让客户端不仅处理json响应,还处理html响应。
我建议你采取第一种方法:
@ControllerAdvice
public class ExceptionControllerAdvice {
@ExceptionHandler(Exception.class)
public ErrorResponse handleException(Exception ex) {
ErrorResponse err = new ErrorResponse();
err.setStatusCode(/* 4XX or 500, depending on exception type */);
err.setERrorMessage(ex.getMessage());
return err;
}
}
public class ErrorResponse {
private int statusCode;
private String errorMessage;
// getters and setters or make the fields public
}
@ControllerAdvice就像一个Spring控制器,但它适用于每个请求。 @ExceptionHandler告诉Spring 拦截指定类型的异常,并在带注释的方法中运行代码。
根据异常的类型,您应该在要返回的ErrorResponse对象中设置正确的状态代码。这是一个非常基本的示例,您还可以从默认的Spring异常解析器扩展并覆盖默认行为。有关详细信息,请参阅this article。
修改强>
您可以尝试的另一件事是强制响应的Content-Type始终为application/json,无论http stastus返回。您可以通过在配置消息转换器和JSON序列化/反序列化属性的类中添加拦截器来实现此目的:
@Configuration
public class ServiceContext
extends WebMvcConfigurationSupport {
@Override
public void configureMessageConverters(List> converters) {
MappingJackson2HttpMessageConverter converter = this.getMappingJackson2HttpMessageConverter();
converters.add(converter);
}
@Bean
public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = this.getObjectMapper();
mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
return mappingJackson2HttpMessageConverter;
}
@Bean
public ObjectMapper getObjectMapper() {
JsonFactory jsonFactory = new JsonFactory();
ObjectMapper objectMapper = new ObjectMapper(jsonFactory);
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); // this is what you need
objectMapper.setSerializationInclusion(Include.NON_NULL); // this is to not serialize unset properties
return objectMapper;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
ResponseHeadersInterceptor headersInterceptor = this.getResponseHeadersInterceptor();
registry.addInterceptor(headersInterceptor).addPathPatterns("/**");
}
@Bean
public ResponseHeadersInterceptor getResponseHeadersInterceptor() {
return new ResponseHeadersInterceptor();
}
}
ResponseHeadersInterceptor如下:
public class ResponseHeadersInterceptor
extends HandlerInterceptorAdapter {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
response.setContentType(MediaType.APPLICATION_JSON_VALUE + "; charset=UTF-8");
}
}
这样,服务器始终响应JSON。如果你仍然得到404或415,毫无疑问这是由于客户端的一些错误。