[英]How to handle Spring Boot's redirection to /error?
I've encountered the same issue as in this question , using Spring Boot 1.3.0 and not having my controllers annotated with @RestController
, just @Path
and @Service
.我遇到了与这个问题相同的问题,使用 Spring Boot 1.3.0 并且没有用@RestController
注释我的控制器,只是@Path
和@Service
。 As the OP in that question says,正如该问题中的 OP 所说,
this is, to me, anything but sensible对我来说,这绝不是明智的
I also can't understand why would they have it redirect to /error.我也不明白他们为什么要把它重定向到/error。 And it is very likely that I'm missing something , because I can only give back 404s or 200s to the client.而且很可能我遗漏了一些东西,因为我只能将 404 或 200 回馈给客户。
My problem is that his solution doesn't seem to work with 1.3.0, so I have the following request flow: let's say my code throws a NullPointerException
.我的问题是他的解决方案似乎不适用于 1.3.0,所以我有以下请求流:假设我的代码抛出NullPointerException
。 It'll be handled by one of my ExceptionMapper
s它将由我的ExceptionMapper
之一处理
@Provider
public class GeneralExceptionMapper implements ExceptionMapper<Throwable> {
private static final Logger LOGGER = LoggerFactory.getLogger(GeneralExceptionMapper.class);
@Override
public Response toResponse(Throwable exception) {
LOGGER.error(exception.getLocalizedMessage());
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
}
}
And my code returns a 500, but instead of sending it back to the client, it tries to redirect it to /error.我的代码返回 500,但它没有将其发送回客户端,而是尝试将其重定向到 /error。 If I don't have another resource for that, it'll send back a 404.如果我没有其他资源,它会发回 404。
2015-12-16 18:33:21.268 INFO 9708 --- [nio-8080-exec-1] o.glassfish.jersey.filter.LoggingFilter : 1 * Server has received a request on thread http-nio-8080-exec-1
1 > GET http://localhost:8080/nullpointerexception
1 > accept: */*
1 > host: localhost:8080
1 > user-agent: curl/7.45.0
2015-12-16 18:33:29.492 INFO 9708 --- [nio-8080-exec-1] o.glassfish.jersey.filter.LoggingFilter : 1 * Server responded with a response on thread http-nio-8080-exec-1
1 < 500
2015-12-16 18:33:29.540 INFO 9708 --- [nio-8080-exec-1] o.glassfish.jersey.filter.LoggingFilter : 2 * Server has received a request on thread http-nio-8080-exec-1
2 > GET http://localhost:8080/error
2 > accept: */*
2 > host: localhost:8080
2 > user-agent: curl/7.45.0
2015-12-16 18:33:37.249 INFO 9708 --- [nio-8080-exec-1] o.glassfish.jersey.filter.LoggingFilter : 2 * Server responded with a response on thread http-nio-8080-exec-1
2 < 404
And client's side (curl):和客户端(卷曲):
$ curl -v http://localhost:8080/nullpointerexception
* STATE: INIT => CONNECT handle 0x6000572d0; line 1090 (connection #-5000)
* Added connection 0. The cache now contains 1 members
* Trying ::1...
* STATE: CONNECT => WAITCONNECT handle 0x6000572d0; line 1143 (connection #0)
* Connected to localhost (::1) port 8080 (#0)
* STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x6000572d0; line 1240 (connection #0)
* STATE: SENDPROTOCONNECT => DO handle 0x6000572d0; line 1258 (connection #0)
> GET /nullpointerexception HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.45.0
> Accept: */*
>
* STATE: DO => DO_DONE handle 0x6000572d0; line 1337 (connection #0)
* STATE: DO_DONE => WAITPERFORM handle 0x6000572d0; line 1464 (connection #0)
* STATE: WAITPERFORM => PERFORM handle 0x6000572d0; line 1474 (connection #0)
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 404 Not Found
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< Content-Length: 0
< Date: Wed, 16 Dec 2015 17:33:37 GMT
<
* STATE: PERFORM => DONE handle 0x6000572d0; line 1632 (connection #0)
* Curl_done
* Connection #0 to host localhost left intact
So it's always a 404. Unless I do have such an /error resource, then what?所以它总是 404。除非我确实有这样的 /error 资源,然后呢? what am I supposed to return?我应该返回什么? All I have at that point is a GET request to /error.那时我所拥有的只是对 /error 的 GET 请求。 And I don't want those extra requests consuming resources and polluting my logs.而且我不希望这些额外的请求消耗资源并污染我的日志。
What am I missing?我错过了什么? And if nothing, what should I do with my exception handling?如果没有,我应该如何处理异常处理?
You can set the Jersey property ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR
to true
.您可以将 Jersey 属性ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR
设置为true
。
Whenever response status is
4xx
or5xx
it is possible to choose betweensendError
orsetStatus
on container specific Response implementation.当响应状态为4xx
或5xx
,可以在容器特定的响应实现上在sendError
或setStatus
之间进行选择。 Eg on servlet container Jersey can callHttpServletResponse.setStatus(...)
orHttpServletResponse.sendError(...)
.例如,在 servlet 容器 Jersey 上可以调用HttpServletResponse.setStatus(...)
或HttpServletResponse.sendError(...)
。Calling
sendError(...)
method usually resets entity, response headers and provide error page for specified status code (eg servleterror-page
configuration).调用sendError(...)
方法通常会重置实体、响应头并为指定的状态代码(例如 servleterror-page
配置)提供错误页面。 However if you want to post-process response (eg by servlet filter) the only way to do it is callingsetStatus(...)
on container Response object.但是,如果您想对响应进行后处理(例如通过 servlet 过滤器),唯一的方法是在容器 Response 对象上调用setStatus(...)
。If property value is true the method
Response.setStatus(...)
is used over defaultResponse.sendError(...)
.如果属性值为 true,则Response.setStatus(...)
方法用于默认Response.sendError(...)
。Type of the property value is
boolean
.属性值的类型是boolean
。 The default value isfalse
.默认值为false
。
You can set Jersey property simply by calling property(key, value)
in your ResourceConfig
subclass constructor.您可以通过在ResourceConfig
子类构造函数中调用property(key, value)
来设置 Jersey 属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.