简体   繁体   English

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

[英]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 or 5xx it is possible to choose between sendError or setStatus on container specific Response implementation.当响应状态为4xx5xx ,可以在容器特定的响应实现上在sendErrorsetStatus之间进行选择。 Eg on servlet container Jersey can call HttpServletResponse.setStatus(...) or HttpServletResponse.sendError(...) .例如,在 servlet 容器 Jersey 上可以调用HttpServletResponse.setStatus(...)HttpServletResponse.sendError(...)

Calling sendError(...) method usually resets entity, response headers and provide error page for specified status code (eg servlet error-page configuration).调用sendError(...)方法通常会重置实体、响应头并为指定的状态代码(例如 servlet error-page配置)提供错误页面。 However if you want to post-process response (eg by servlet filter) the only way to do it is calling setStatus(...) on container Response object.但是,如果您想对响应进行后处理(例如通过 servlet 过滤器),唯一的方法是在容器 Response 对象上调用setStatus(...)

If property value is true the method Response.setStatus(...) is used over default Response.sendError(...) .如果属性值为 true,则Response.setStatus(...)方法用于默认Response.sendError(...)

Type of the property value is boolean .属性值的类型是boolean The default value is false .默认值为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.

相关问题 Spring 开机@Getmapping 重定向错误 - Spring boot @Getmapping redirection error 如何在我的春季启动代码中处理Amazon S3存储桶的404错误 - How to handle 404 error for amazon s3 bucket in my spring boot code 如何处理来自 Spring Boot 的 LdapAuthenticationProviderConfigurer 的异常 - How to handle exceptions from Spring Boot's LdapAuthenticationProviderConfigurer 如何从Spring Boot ldap处理和自定义错误401? - How to handle and custom error 401 from Spring boot ldap? 如何在spring boot注释中处理403 forbidden错误? - How to handle 403 forbidden error in spring boot annotation? 如何处理 Spring Boot 中的 GraphQL 查询验证错误 - How to handle GraphQL query validation error in Spring Boot 如何在Spring Boot中处理SQLIntegrityConstraintViolationException? - How to handle the SQLIntegrityConstraintViolationException in Spring Boot? 如何处理 Spring 启动中的 UnsupportedMediaTypeException? - How to handle UnsupportedMediaTypeException in Spring Boot? 在自定义身份验证过滤器上处理Spring Boot上的错误 - Handle error on Spring Boot at custom authentication filter 如何用空白页替换 Spring Boot 的“白标错误页”? - How to replace Spring Boot's "Whitelabel Error Page" with a blank page?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM