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

标签 java cxf cxfrs

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

public interface RequestHandler {

    Response handleRequest(Message m, 
                           ClassResourceInfo resourceClass);

}

我不知道如何获取将从 resourceClass 调用的 Method。这可能吗?

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

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

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

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


为了完整起见,这里是关于该主题的文档:http://cxf.apache.org/docs/jax-rs-filters.html

最佳答案

您可以使用拦截器,而不是 RequestHandler 过滤器,因为请求处理程序在 JAXRS 2.0 中已被弃用并替换为 ContainerRequestFilterContainerResponseFilter/p>

例如

假设我有如下所示的 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);
        }

    }

}

关于java - 在 CXF RS 中,我可以在请求过滤器中获取资源方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29637111/

相关文章:

java - 在 REST 服务中返回 XML 响应

apache-camel - 任何人都可以指出我使用 cxfrs 客户端/生产者的工作示例 Camel 路线吗?

java - 何时以及如何使用 hibernate 二级缓存?

java - JAX-WS = 安装 Apache CXF 时 "steals"默认 JDK JAX-WS 实现,如何解决?

java - CXF java2ws : how to include external xsd files?

java - CXF 客户端 : unable to find valid certification path to requested target

cxf - 蓝图、Apache Camel 和 cxfrs

java - 使用android时关闭android View :layout_centerVertical ="true"?

java - 在android中解析JSON返回null对象

java - 在Customiz map中获取请求参数map?