【问题标题】:Log4j, maven tomcat7-maven-plugin, spring rest serviceLog4j, maven tomcat7-maven-plugin, spring rest服务
【发布时间】:2013-11-07 11:07:27
【问题描述】:

我喜欢测试我的休息服务项目,但它似乎没有以适当的方式工作,无论如何我可以自己解决这个问题,但我必须确保获得调试信息。 (我只看到状态码:400 Bad Request,说明客户端发送的请求语法错误。)

好的,我在 pom 文件中使用了带有以下配置的 tomcat7-maven-plugin

        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.0</version>
            <configuration>
                <port>9090</port>
                <httpsPort>9443</httpsPort>
                <!-- <path>/${project.build.finalName}</path> -->
                <contextFile>${basedir}/src/main/resources/context.xml</contextFile>
                <keystoreFile>${basedir}/src/main/resources/server.jks</keystoreFile>
                <keystorePass>123456</keystorePass>

            </configuration>
        </plugin>

log4j 文件保留在 /src/main/resources/ 文件夹中,并将照常复制到 classes 文件夹中。

看起来像

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration>

    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d +++ P R O D +++ [%t] %c: %m%n" />
        </layout>
    </appender>

    <logger name="org">
        <level value="error" />
    </logger>
    <logger name="org.springframework.web">
        <level value="DEBUG" />
    </logger>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="console" />
    </root>

</log4j:configuration>

我在插件所需的同一文件夹中也有一个 content.xml

<?xml version='1.0' encoding='utf-8'?>
<Context cookies="true" >
  <!-- disable session persistence: -->
  <Manager pathname="" />
</Context>

我用 mvn clean tomcat7:run-war 启动应用程序,但是没有打印出请求不正确的原因,根本没有打印错误。

我也尝试了不同的方法,但没有成功:

  • 我将 ExeptionHandler 添加到带有和不带有 ResponseStatus 注释的类中

     @ExceptionHandler
     @ResponseStatus(HttpStatus.BAD_REQUEST)
     public void handle(HttpMessageNotReadableException e) {
          logger.warn("Returning HTTP 400 Bad Request", e);
     }
    
  • 我将 log4j 依赖项添加到插件配置中,它们也在项目依赖项中,仅提一下。

  • 我将 log4j.xml 移到了 WEB-INF 文件夹中
  • 我从 mvn -X clean tomcat7:run-war 开始
  • 我将资源配置添加到 pom.xml 文件中的插件配置

                <resources>
                    <resource>
                        <includes>
                            <include>**/log4j.xml</include>
                        </includes>
                    </resource>
                </resources>
    
  • 我还检查了 commons-logging 和 slf4j 的依赖关系并将它们排除在外

所有这些操作都不会激活我的休息服务后呼叫的日志记录。 啊,我使用了 firefox restclient 和 curl,我还转义了 curl 中的引号,因为我在另一个线程中找到了。

我也可以,如果我启用了不同的记录器,只是为了获取那里发生的信息。

【问题讨论】:

  • 错误 400 不一定是您的应用程序中的错误。它也可能是客户端调用中的错误。例如调用错误或未发送完整的请求标头。您是否按照@CodeChimp 的建议捕获了请求标头?此外,我们在某些防病毒和 Java 网络流量方面遇到了严重问题。

标签: java spring rest maven tomcat


【解决方案1】:

我相信@ExceptionHandler 只有两种有效的返回类型:

  1. String 指示要向用户显示的视图
  2. ModelAndView,还设置了正确的视图以显示给用户

您的方法似乎返回 void,我相信这会使 Spring 完全忽略异常处理程序。

至于错误请求,您能发布您发送的内容以及 REST 服务的样子吗?您可以使用 FireFox 的 Firebug 插件来捕获请求。

【讨论】:

  • nop,我对此进行了测试,如果添加 @ResponseBody 注释,即使值对象也是有效的。
  • 顺便说一句,我基于实际文档,指出“返回类型可以是字符串,它被解释为视图名称或 ModelAndView 对象。”在此处找到文档:docs.spring.io/spring/docs/3.0.x/spring-framework-reference/…
【解决方案2】:

好吧,我想我明白了,

拳头,

  • 异常处理程序

    @ExceptionHandler
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public void handle(HttpMessageNotReadableException e) {
        logger.warn("Returning HTTP 400 Bad Request", e);
    }
    

应该在每个 REST 服务类中,用于调试活动,如果缺少,则不会在日志中写入任何内容。

  • commons-logging 依赖项应该在依赖项列表中可用
  • 需要 WEB-INF 或 /src/main/resources 中的 log4j.xml 或 log4j.properties
  • 我将所有记录器设置为DEBUG,但这对于Rest 调试不是必需的,它取决于ExceptionHandler 的日志级别。在我的版本中,WARN 可以很好地获取输出

我在问题中描述的所有其他变体都不是必需的,在我在所有类中添加 ExceptionHandler 后,基本版本运行良好。

如果您还想向客户提供更多信息,最好遵循“CodeChimp”的建议。如果您只是添加一个字符串,它将提供名为 page 的字符串,或者您可以添加更多信息,例如 ModelAndView,如果您使用

注释方法,您甚至可以添加 json 或 xml 响应
@ResponseBody

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 1970-01-01
    • 2017-08-18
    • 2014-01-11
    • 1970-01-01
    • 2012-07-01
    • 2013-12-03
    • 1970-01-01
    • 2015-10-17
    相关资源
    最近更新 更多