使用Spring aop拦截Jersey资源方法

时间:2016-10-30 15:47:16

标签: spring jersey aop jersey-2.0 spring-aop

我正在尝试使用spring aop来拦截我的球衣资源方法。我想实现api版本控制,我将请求转换为最新版本,在资源方法中做一些工作,然后将响应转换为请求的api版本。

我目前正在使用春季和球衣。我试图使用spring aop拦截球衣资源方法,乍一看它似乎有效。但是,我注意到了一个问题。

使用spring aop时,通过jersey(例如@Context HttpHeaders)注入RootResource类的任何内容都为null。它在advice方法和资源方法中都是null。当我禁用aop时,属性将正确注入并在资源方法中可访问。

有关正在发生的事情以及如何解决问题的任何想法?

RootResource类:

@Component
@Path("test")
public class RestService extends BaseService {

    @Autowired
    RestService(MyClass myclass) {
        super(myclass);
    }


    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("{param1}")
    public Integer get(@PathParam("param1") Integer param1) {
        // I can access myClass fine, but headers and context are null!
        return param1;
    }

}

BaseService类:

public abstract class BaseService {
    @Context
    public HttpHeaders headers;
    @Context
    protected ServletContext context;

    protected MyClass myClass;

    BaseService(MyClass myClass) {
        this.myClass = myClass;
    }
}

spring aop interceptor:

@Aspect
public class Test {

    @Around("execution(* biocode.fims.rest.services..*.*(..))")
    public Object transformRequest(ProceedingJoinPoint jp) throws Throwable {
        BaseService baseService = (BaseService) jp.getTarget();
        I can access myClass fine, but headers and context are null;
        Object val = jp.proceed();
        return val;
    }
}

1 个答案:

答案 0 :(得分:0)

好的,所以看起来这是jersey-spring3中的一个错误。 Issue

有一个公关来解决这个问题,但没有评论。我试图让这个合并。 Github PR