【问题标题】:Why LoggingFilter is not executed?为什么不执行 LoggingFilter?
【发布时间】:2018-04-09 11:18:00
【问题描述】:

我使用的是 java 8。我使用 jersey 2.26 作为 jax-rs 实现。一切正常,但我无法登录。

我已经用 eclipse 生成了 WS 存根:

文件 -> 新项目 -> maven prokect -> 过滤球衣 2.26 -> 插入我的 groupid 和 artifactid -> 完成。

以下是我的资源类:

package mypackage;

import ...

/**
 * Root resource (exposed at "myresource" path)
 */
@Path("myresource")
public class MyResource {

    @EJB
    private Service service;

    private Logger logger = Logger.getLogger(getClass().toString());

    /**
     * Method handling HTTP GET requests. The returned object will be sent
     * to the client as "application/json" media type.
     *
     * @return MyObject that will be returned as a application/json response.
     */
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Logged
    public MyObject getIt() {
        logger.info("LOOOOOOOOOOOOOOOOOOOOOOOOOOOOOG");
        //some computation
        return result;
    }

}

以下是我的 LoggingFilter:

package log;

import ...


@Logged
public class LoggingFilter implements ContainerRequestFilter, ContainerResponseFilter {

    private Logger logger = Logger.getLogger(getClass().toString());

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
            throws IOException {
        logger.info("RESPOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONSE");
        logger.info(requestContext.toString());
        logger.info(responseContext.toString());

    }

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        logger.info("REQUEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEST");
        logger.info(requestContext.toString());
    }

}

以下是我的界面:

package log;

import ...

import javax.ws.rs.NameBinding;

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(value = RetentionPolicy.RUNTIME)
@NameBinding
public @interface Logged { }

以下是我的web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!-- This web.xml file is not required when using Servlet 3.0 container,
     see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>mypackage</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

LogginFilter 中的过滤器方法永远不会被调用。但是会打印“LOOOOOOOOOOOOOOOOOOOOOOOOOOOOG”。

【问题讨论】:

    标签: java logging interface jersey jax-rs


    【解决方案1】:

    你需要两件事。首先,用下面的

    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>mypackage</param-value>
    </init-param>
    

    您仅将mypackage 列为要扫描的包,但过滤器位于log 包中。您可以添加以逗号分隔的 log 包。

    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>mypackage,log</param-value>
    </init-param>
    

    但通常你应该打包你的应用程序的方式是至少有一个根包,所有其他包都是子包。例如

    com.foo.resources
    com.foo.filters
    

    这里的com.foo 是根包。你可以在这里做的只是将com.foo列为要扫描的包,Jersey会递归扫描它,包括com.foo.resourcescom.foo.filters

    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.foo</param-value>
    </init-param>
    

    您需要的第二件事是过滤器上的@Provider 注释。包扫描查找@Path@Provider 注释类进行注册。

    【讨论】:

      【解决方案2】:

      这个网站是圣经:https://blog.dejavu.sk/2013/11/19/registering-resources-and-providers-in-jersey-2/

      你必须选择:

      1. 在 web.xml 中注册您的球衣供应商
      2. 创建扩展 resourceConfig 的应用程序。

      我选择了第一种可能性。

      【讨论】:

        猜你喜欢
        • 2011-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-22
        • 2011-12-17
        • 2023-03-25
        相关资源
        最近更新 更多