我有一个JaxWS资源需要将标头参数处理成一个复杂的对象。为简单起见,假设ParamConverterProvider实例已经单独注册到应用程序,它会在给定String输入的情况下构建一个MyComplexObject实例。
我想有一个在任何资源方法之前执行的方法,以执行一些常见的初始化。我无法找到任何编写此方法的方法,除非手动调用它作为每个资源方法的第一行。
使用@PostConstruct(如下图所示)不起作用,因为它执行得太早。 ResourceInfo尚不可用(因为还没有任何请求)。
@Path("/my-resource")
@Produces({ MediaType.APPLICATION_JSON })
public abstract class MyResource {
@Context
private ResourceInfo resource;
@HeaderParam("my-complex-obj")
private MyComplexObject complexObject;
@PostConstruct
public final void init() {
if (resource.getResourceClass().isAnnotationPresent(Annotation.class)) {
// perform some logic using complexObject
}
}
@GET
@Path("/my-method")
public final void myMethod() throws Exception {
// do stuff
}
}
我想象的另一种方法是通过编写一个单独的Filter来完成工作,如下所示。但是,这不起作用,因为@HeaderParam只允许在资源类中使用。
@Provider
@Priority(Priorities.USER)
public class MyFilter implements ContainerRequestFilter {
@Context
ResourceInfo resource;
@HeaderParam("my-complex-obj")
private MyComplexObject complexObject;
@Override
public void filter(ContainerRequestContext ctx) throws IOException {
if (resource.getResourceClass().isAnnotationPresent(Annotation.class)) {
// perform some logic using complexObject
}
}
}
关于如何实现这一目标的任何建议?
答案 0 :(得分:0)
如何使用HttpHeaders? http://docs.oracle.com/javaee/6/api/javax/ws/rs/core/HttpHeaders.html
import javax.ws.rs.core.HttpHeaders;
@Provider
@Priority(Priorities.USER)
public class MyFilter implements ContainerRequestFilter {
@Context
ResourceInfo resource;
@Context
HttpHeaders httpHeader;
@Override
public void filter(ContainerRequestContext ctx) throws IOException {
if (resource.getResourceClass().isAnnotationPresent(Annotation.class)) {
// perform some logic using complexObject
}}