在CXF RS中,我可以在请求过滤器中获取资源方法吗?

时间:2015-04-14 20:47:12

标签: java cxf cxfrs

我想根据调用的方法授权对我的rest api进行不同的调用。但RequestHandler看起来像这样:

public interface RequestHandler {

    Response handleRequest(Message m, 
                           ClassResourceInfo resourceClass);

}

我无法弄清楚如何从Method获取将要调用的resourceClass。这可能吗?

ResponseHandler似乎有一个名为OperationResourceInfo的参数:

public interface ResponseHandler {
    Response handleResponse(Message m,
                            OperationResourceInfo ori,
                            Response response);
}

但到那时,我已经删除了一些我无权删除的内容(例如)。

如何确定在请求过滤器中调用哪种方法? FWIW,我想要Method的原因是因为我想搜索我将放在每个方法上的自定义构建的注释。如果有更好的方法来解决这个问题,我可以接受这个想法。


为了完整起见,请参阅以下主题的文档:http://cxf.apache.org/docs/jax-rs-filters.html

1 个答案:

答案 0 :(得分:1)

您可以使用拦截器而不是RequestHandler过滤器,因为不推荐使用请求处理程序并在JAXRS 2.0中使用ContainerRequestFilterContainerResponseFilter替换

例如

说我的RestService如下所示

@Service
@Path("/Course")
public class KPRestService {

    private final Logger LOG = LoggerFactory.getLogger(KPRestService.class);

    @POST
    @Path("/create")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response create(CourseType course){
        LOG.info("You have selected {}", course.getCName());
        return Response.ok().build();
    }

    @POST
    @Path("/get")
    @Produces(MediaType.APPLICATION_JSON)
    public CourseType get(@FormParam("cDate")Date date){

        final CourseType course = new CourseType();
        if(date.after(new Date())){
            course.setCName("E&C");
            course.setCDuration(4);
        }else{
            course.setCName("Mech");
            course.setCDuration(3);
        }

        return course;
    }

}

我阻止使用拦截器调用get方法,如下所示。

@Component
public class KPFilter extends AbstractPhaseInterceptor<Message> {

    private final static Logger LOG = LoggerFactory.getLogger(KPFilter.class);

    public KPFilter() {
        super(Phase.PRE_LOGICAL);

    }

    public void handleMessage(Message message) throws Fault {

        final Exchange exchange = message.getExchange();

        exchange.put(Message.REST_MESSAGE, Boolean.TRUE);
        OperationResourceInfo resourceInfo = exchange.get(OperationResourceInfo.class);
        LOG.info("Method name is {}", resourceInfo.getMethodToInvoke().getName());
        if (resourceInfo != null && resourceInfo.getMethodToInvoke().getName().equals("get")) {
            Response response = Response.status(Response.Status.FORBIDDEN).entity("You are not authorised")
                    .type(MediaType.TEXT_XML).build();
            exchange.put(Response.class, response);
        }

    }

}