在JAX-RS中的每个@POST或@DELETE请求之前或之后调用方法

时间:2014-04-21 13:26:41

标签: java web-services rest jax-rs

JAX-RS中是否有任何方法或注释允许我在执行匹配请求方法之前或之后调用方法。让我们假设我有以下服务类:

public class MyService {

    ...

    @POST
    @Path("{id : \\d+}")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response updateServiceObject(@PathParam("id") long id, InputStream is) {
        try {
            // Fetch the service object ...
            ServiceObject updatedServiceObj = readServiceObject(is);

            // ... and try to update it.
            updated = getServiceObjectDao().update(updatedServiceObj);

            if (updated == 0) {
                throw new WebApplicationException(Response.Status.NOT_FOUND);
            }

            return Response.ok().build();
        } catch (Exception e) {
            throw new WebApplicationException(Response.Status.BAD_REQUEST);
        }
    }

    @DELETE
    @Path("{id : \\d+}")
    public Response deleteServiceObject(@PathParam("id") long id) {
        try {
            getServiceObjectDao().deleteById(id);
        } catch (Exception e) {
            throw new WebApplicationException(Response.Status.BAD_REQUEST);
        }

        return Response.ok().build();
    }
}

我想添加一个方法logEvent(),它记录了已调用的方法以及提供了哪些参数(仅@PathParam值)。因此,必须在每次通话之前或之后调用它。

4 个答案:

答案 0 :(得分:0)

这听起来非常适合方面或过滤器。过滤器是HTTP方面。

答案 1 :(得分:0)

将此添加到您的cxf xml。

<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:cxf="http://cxf.apache.org/core"
      xsi:schemaLocation="
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    <cxf:bus>
        <cxf:features>
            <cxf:logging/>
        </cxf:features>
    </cxf:bus> 
</beans>

参考:http://cxf.apache.org/docs/configuration.html

答案 2 :(得分:0)

在此页面中https://cxf.apache.org/docs/jax-rs-filters.html解释了如何使用JAX-RS为CXF实现拦截器和过滤器。

答案 3 :(得分:-2)

使用面向方面编程(AOP)