代码之家  ›  专栏  ›  技术社区  ›  StackUser

为什么不执行LoggingFilter?

  •  0
  • StackUser  · 技术社区  · 7 年前

    我正在使用java 8。我使用jersey 2.26作为jax rs实现。一切正常,但我无法记录。

    我已使用eclipse生成WS-stub:

    文件->新建项目->maven项目->过滤球衣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 { }
    

    以下是我的网站。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中的filter方法。然而,“loooooooooooooooooooog”是打印出来的。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Paul Samsotha    7 年前

    你需要两样东西。首先,使用以下内容

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

    仅限您列出 mypackage 作为要扫描的包,但筛选器位于 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.resources com.foo.filters

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

    你需要的第二件事是 @Provider 过滤器上的注释。包扫描查找 @Path @供应商 要注册的注释类。

        2
  •  0
  •   StackUser    7 年前

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

    您必须在以下两者之间进行选择:

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

    我选择了第一种可能性。

    推荐文章