- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个基于 Spring MVC 的 Rest Web 服务。我用@RestControllerAdvice
处理从我的 @Controller
抛出的异常s。
调用示例如下
@GetMapping(value = "/{id}/{name:.+}", produces = { MediaType.APPLICATION_OCTET_STREAM_VALUE,
MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE })
ResponseEntity<byte[]> getSomething(
@PathVariable("id") String id, @PathVariable("name") String name) throws customException;
可以生成 3 种媒体类型的基本方法:APPLICATION_OCTET_STREAM_VALUE
, APPLICATION_XML_VALUE
和APPLICATION_JSON_VALUE
并抛出 customException
我的@RestControllerAdvice
的定义如下:
@ExceptionHandler({ CustomException.class })
public ResponseEntity<Object> handleException(CustomException e) {
ErrorDto err = errorMapper.map(e);
Enumeration<String> en = httpServletRequest.getHeaders(HttpHeaders.ACCEPT);
while (en.hasMoreElements()) {
String list = en.nextElement();
StringTokenizer st = new StringTokenizer(list, ",");
while (st.hasMoreTokens()) {
String acc = st.nextToken();
MediaType contentTypeHeader = MediaType.valueOf(acc);
if (MediaType.APPLICATION_XML.includes(contentTypeHeader)) {
JAXBElement<ErrorDto> ret = new ObjectFactory().createError(err);
return ResponseEntity.status(HttpStatus.PRECONDITION_FAILED)
.contentType(MediaType.APPLICATION_XML).body(ret);
} else if (MediaType.APPLICATION_JSON.includes(contentTypeHeader)) {
return ResponseEntity.status(HttpStatus.PRECONDITION_FAILED)
.contentType(MediaType.APPLICATION_JSON).body(err);
}
}
}
return ResponseEntity.status(HttpStatus.NOT_ACCEPTABLE).body(null);
}
根据请求接受 header ,@ExceptionHandler
返回一个 null 主体和 NOT_ACCEPTABLE
如果未设置接受或类型为 ErrorDto
的对象,则 http 响应状态如果接受的类型为APPLICATION_JSON
或JaxbElement
的ErrorDto
接受的类型为 APPLICATION_XML
<小时/>Please note that I specify the content type of the response when it contains a body.
我的问题是,当客户端使用多个接受 header 进行调用时,Spring 会尝试获取 HttpMessageConverter
根据接受 header 而不是响应内容类型。下面是一个例子:
当客户端调用抛出异常(然后返回 errorDto)且具有多个 Accept header 的方法时,如下所示:
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_OCTET_STREAM_VALUE);
headers.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_XML_VALUE);
HttpEntity<?> entity = new HttpEntity<>(body, headers);
restTemplate.exchange(uriComponents.encode().toUri(), httpMethod, entity, Class);
Spring 没有按预期返回 XML 格式的错误响应。它寻找 Octet-Stream <-> JaxbElement
不存在的转换器,不会尝试根据响应内容类型查找转换器。
我正在使用:
最佳答案
Spring 有这个错误。根据RFC2616, 406 Not Acceptable :
Note: HTTP/1.1 servers are allowed to return responses which are
not acceptable according to the accept headers sent in the
request. In some cases, this may even be preferable to sending a
406 response. User agents are encouraged to inspect the headers of
an incoming response to determine if it is acceptable.
根据我的经验,REST 服务的错误处理是最好强制响应简单内容(例如文本/纯文本)的情况之一,以便向客户端获取有意义的错误消息。
Spring 这里的过度固执行为具有掩盖 406 响应中发生的主要错误的效果。因此,上述 RFC 注释同样适用于所有 4xx 和 5xx 响应。如果您无法匹配已接受的内容类型,那么您可能不应该发送 1xx、2xx 或 3xx 范围内的任何响应。
关于java - Spring HttpMessageConverter 根据@ExceptionHandler响应内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41827742/
我知道 Exception 是所有异常的父级,但我认为当您为特定异常类设置 @ExceptionHandler 时,它应该处理该特定异常。 也许您可以指出我在以下代码中遗漏的内容,以便 MethodA
我开发了一个 Web 应用程序,其中表单验证异常应该由 @ExceptionHandler 处理(需要灵活),一般系统异常由 SimpleMappingExceptionResolver 处理(执行电
在我的应用程序中,我在 web.xml 中配置了一个错误页面。我需要根据条件覆盖特定 Controller 。在这里,当条件成立时,我需要重定向到特定的错误页面,否则应该呈现正常的错误页面。这是代码。
经过一段时间的研究和尝试不同的事情后,我仍然无法在 jUnit 集成测试中调用我的 @ExceptionHandler。请帮我理解为什么? @RequestMapping(value = "/some
我将在我的 Web 应用程序上引入全局处理程序: @ControllerAdvice public class GlobalControllerExceptionHandler { @Exce
我一直在兜圈子试图修复测试,但 SO 或其他在线资源都没有提供解决方案。我有这个@ControllerAdvice处理 MyException 的方法异常(exception)是: @Controll
这个问题在 Google 领域已被问过几次,但我似乎无法将这些解决方案应用于我的情况。我的 J2EE 应用程序使用 Spring,之前我使用 SimpleMappingExceptionResolve
我正在使用 springmvc 为客户端创建 restful api,我有一个用于检查 accesstoken 的拦截器。 public class AccessTokenInterceptor ex
我的 Controller 中有一个方法可以处理应用程序抛出的异常。所以我有一个这样的方法。 @Controller public class ExceptionController { @R
我使用 @ControllerAdvice 来处理我所有的应用程序异常: @ControllerAdvice public class ExceptionHandlingController {
我正在使用以下代码处理我的受控异常: @ExceptionHandler(MyException.class) @ResponseStatus(HttpStatus.NOT_FOUN
我构建了一个简单的 ExceptionHandler 类: class ExceptionHandler{ public function __construct(){ set
我不知道如何通过@ExceptionHandler 处理一种以上的异常。 我需要以编程方式处理这些异常,为此我需要一个共享引用。这是通过此引用“Exception ex”完成的吗?我不这么认为,因为没
我正在使用默认 AnnotationMethodHandlerAdapter,我认为它应该启用对@ExceptionHandler 的支持。不幸的是,如果调用如下所示的处理程序方法,则会抛出 Serv
我正在使用 spring 的 @ControllerAdvice 和 @ExceptionHandler 进行异常处理。任何方法都会从 Controller 中抛出自定义异常,并由相应的 @Excep
我有一个像 @RestController public class CustomerRestController { @Autowired private CustomerManag
在我的Micronaut应用程序中,我定义了ExceptionHandler,应该捕获WorkflowException并返回状态码为412且主体为HttpResponse的WorkflowExcep
我有这样的异常处理程序: @ControllerAdvice public classMyExceptionHandler extends ResponseEntityExceptionHandler
我在 spring RestController 中有这样的异常处理程序。 @ExceptionHandler(AuthException.class) public ResponseEntit
我遇到问题,然后我 try catch 异常。 这是我的类,它实现了 ResponseErrorHandler: public class ErrorGenerator implements
我是一名优秀的程序员,十分优秀!