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

时间:2015-12-16 17:46:32

标签: java spring-boot jersey jax-rs jersey-2.0

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

  

这对我来说,除了明智之外什么

我也无法理解他们为什么会将其重定向到/错误。而很可能是我错过了,因为我只能向客户回馈404或200.

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

之一处理
ExceptionMapper

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

@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();
    }
}

客户方(卷曲):

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

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

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

1 个答案:

答案 0 :(得分:2)

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

  

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

     

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

     

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

     

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

您只需在property(key, value)子类构造函数中调用ResourceConfig即可设置Jersey属性。