我使用的是 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 中的过滤器方法永远不会被调用。然而,“LOOOOOOOOOOOOOOOOOOOOOOOOOOOOOG”被打印出来。
你需要两件事。首先,与以下
<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.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
并@Provider
注解要注册的类。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句