相关疑难解决方法(0)

如何使用Spring MVC/Spring Boot编写正确的全局错误处理程序

我正在编写一个使用Spring 4.0.4和Spring Boot 1.0.2的Web应用程序,使用Tomcat作为嵌入式Web容器,我想实现一个全局异常处理,它拦截所有异常并以特定方式记录它们.我的简单要求是:

  • 我想全局处理尚未在其他地方处理的所有异常(例如在控制器异常处理程序中).我想记录消息,我想向用户显示自定义错误消息.
  • 我不希望Spring或Web容器自己记录任何错误,因为我想自己这样做.

到目前为止,我的解决方案看起来像这样(简化,没有日志记录,也没有重定向到错误视图):

@Controller
@RequestMapping("/errors")
public class ErrorHandler implements EmbeddedServletContainerCustomizer
{
    @Override
    public void customize(final ConfigurableEmbeddedServletContainer factory)
    {
        factory.addErrorPages(new ErrorPage("/errors/unexpected"));
        factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/errors/notfound"));
    }

    @RequestMapping("unexpected")
    @ResponseBody
    public String unexpectedError(final HttpServletRequest request)
    {
        return "Exception: " + request.getAttribute("javax.servlet.error.exception");
    }

    @RequestMapping("notfound")
    @ResponseBody
    public String notFound()
    {
        return "Error 404";
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是该unexpectedError方法正确处理控制器中抛出的异常,并且该方法处理404状态代码notFound.到目前为止很好,但我有以下问题:

  • Tomcat或Spring(不确定谁负责)仍在记录错误消息.我不希望这样,因为我想自己记录(附加信息),我不希望日志中出现重复的错误消息.如何防止此默认日志记录?
  • 我访问异常对象的方式似乎不对.我从request属性中获取if javax.servlet.error.exception.这甚至不是抛出的异常,它是一个实例,org.springframework.web.util.NestedServletException我必须深入到这个嵌套异常中来获取真实异常.我很确定有一种更简单的方法,但我找不到它.

那么我该如何解决这些问题呢?或者我实现这个全局异常处理程序的方式是完全错误的,还有更好的选择吗?

java spring tomcat spring-mvc spring-boot

39
推荐指数
1
解决办法
5万
查看次数

当spring boot启动时,抛出"方法名称必须是令牌"异常

当spring boot启动时,抛出method names must be tokens异常

2016-08-11 16:53:54.499  INFO 14212 --- [0.1-8888-exec-1] o.apache.coyote.http11.Http11Processor   : Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
        at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:462) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:994) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.4.jar!/:8.5.4]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785) [tomcat-embed-core-8.5.4.jar!/:8.5.4]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425) [tomcat-embed-core-8.5.4.jar!/:8.5.4]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.4.jar!/:8.5.4]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_72]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_72]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.4.jar!/:8.5.4]
        at java.lang.Thread.run(Thread.java:745) [na:1.8.0_72]

2016-08-11 16:53:58.885 …
Run Code Online (Sandbox Code Playgroud)

java spring

33
推荐指数
4
解决办法
5万
查看次数

什么是错误“方法名称中发现无效字符。HTTP 方法名称必须是令牌”

我使用 Spring Boot 时遇到以下错误。我启用了 TRACE 级别日志记录,但仍然不确定导致它的原因或如何修复它。

[TRACE] 2020-01-02 12:12:23.749 [http-nio-9000-exec-1] DispatcherServlet - "ERROR" dispatch for GET "/error", paramet
ers={}, headers={masked} in DispatcherServlet 'dispatcherServlet'
[TRACE] 2020-01-02 12:12:23.750 [http-nio-9000-exec-1] RequestMappingHandlerMapping - 2 matching mappings: [{ /error}
, { /error, produces [text/html]}]
[TRACE] 2020-01-02 12:12:23.751 [http-nio-9000-exec-1] RequestMappingHandlerMapping - Mapped to public org.springfram
ework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.w
/Exc
...skipping
[INFO ] 2020-01-02 16:29:57.815 [http-nio-9000-exec-31] Http11Processor - Error parsing HTTP request header
 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level. …
Run Code Online (Sandbox Code Playgroud)

tomcat spring-boot

6
推荐指数
1
解决办法
4万
查看次数

SpringBoot - 解析HTTP请求标头时出错

我正在运行SpringBoot Application刚检查的服务器日志,并得到了这样的几个错误.由于每天12/24小时后出现错误,我无法理解是什么原因造成的.

运行Tomcat版本 8.5.11

2018-03-04 17:03:26 [http-nio-8080-exec-85] INFO  o.a.coyote.http11.Http11Processor - Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
    at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:421)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:667)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:798)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1434)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
Run Code Online (Sandbox Code Playgroud)

java spring spring-boot

5
推荐指数
2
解决办法
2万
查看次数

标签 统计

java ×3

spring ×3

spring-boot ×3

tomcat ×2

spring-mvc ×1