如何处理Spring Boot重定向到/ error?

我遇到了与此问题相同的问题,使用Spring Boot 1.3.0并且没有使用@RestController注释我的控制器,只有@Path@Service 。 正如该问题中的OP所说,

对我来说,这不是明智的事

我也无法理解他们为什么会重定向到/错误。 我很可能错过了一些东西 ,因为我只能向客户回馈404或200。

我的问题是他的解决方案似乎不适用于1.3.0,所以我有以下请求流:让我们说我的代码抛出NullPointerException 。 它将由我的一个ExceptionMapper处理

 @Provider public class GeneralExceptionMapper implements ExceptionMapper { 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(); } } 

我的代码返回500,但不是将其发送回客户端,而是尝试将其重定向到/ error。 如果我没有其他资源,它会发回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  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 

客户方(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  DONE handle 0x6000572d0; line 1632 (connection #0) * Curl_done * Connection #0 to host localhost left intact 

所以它总是404.除非我确实有这样的/错误资源,那么呢? 我应该回来的是什么? 我当时所有的都是对/错误的GET请求。 而且我不希望那些额外的请求消耗资源并污染我的日志。

我错过了什么? 如果没有,我的exception处理应该怎么办?

您可以将Jersey属性ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR设置为true

每当响应状态为4xx5xx ,可以在容器特定的响应实现上选择sendErrorsetStatus 。 例如,在servlet容器上,Jersey可以调用HttpServletResponse.setStatus(...)HttpServletResponse.sendError(...)

调用sendError(...)方法通常会重置实体,响应头并为指定的状态代码提供错误页面(例如,servlet error-page配置)。 但是,如果要进行后处理响应(例如,通过servletfilter),唯一的方法是在容器Response对象上调用setStatus(...)

如果属性值为true,则使用方法Response.setStatus(...)而不是默认的Response.sendError(...)

属性值的类型是boolean 。 默认值为false

您可以通过在ResourceConfig子类构造函数中调用property(key, value)来设置Jersey属性。