如何创建Jersey Jax-RS资源请求级init方法

时间:2015-01-23 01:14:42

标签: java jersey jax-rs

我有一个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
            }
    }
}

关于如何实现这一目标的任何建议?

1 个答案:

答案 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
        }}