如何在Jersey中的MessageBodyWriter中检索资源方法的Annoations?

时间:2015-12-22 12:25:01

标签: java annotations jersey exceptionmapper

jersey 2.21。

我有一个如下所示的资源文件

……
@POST
@Path("/userReg")
@Produces("application/json;charset=UTF-8")
public JsonResp userReg(UserRegReq userRegReq) throws LoginNameExists {
    HttpHeaderUtils.parseHeaders(userRegReq, headers);

    //JsonResp is a custom java class.
    JsonResp result = new JsonResp();

    //will throw LoginNameExists
    User user = userManager.register(userRegReq.getLoginName(), userRegReq.getPassword());

    //success
    result.setResult(0);
result.setData(user.getId);

    return result;
}
……

要将结果返回给客户端,我实现了一个自定义MessageBodyWriter,如下所示

@Produces("application/json")
public class MyRespWriter implements MessageBodyWriter<JsonResp> {

    @Override
    public boolean isWriteable(Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType) {
        return type == JsonResp.class;
    }

    @Override
    public long getSize(JsonResp jsonResp, Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType) {
        return 0;
    }

    @Override
public void writeTo(JsonResp jsonResp, Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> multivaluedMap, OutputStream outputStream) throws IOException, WebApplicationException {
        //if these no exception in userReg(), 
        //the parameter annotations contains the annotations 
        //such as POST, Path, Produces;
        //but if there is an exception in userReg(), 
        //the parameter annotations contains none of POST, Path, Produces; 
        //So, is there any way to retrieve the original annotations all along?


        //JsonUtils is a custom java class.
        String data = JsonUtils.toJsonString(jsonResp);
        Writer osWriter = new OutputStreamWriter(outputStream, "UTF-8");
        osWriter.write(data);
        osWriter.flush();
    }
}

为了处理异常,我实现了这样的ExceptionMapper:

public class MyExceptionMapper implements ExceptionMapper<Exception> {

    public Response toResponse(Exception e) {

        JsonResp result = new JsonResp();

        //error
        result.setResult(-1);
        result.setErrMsg("System error.");

        return Response.ok(result, MediaType.APPLICATION_JSON_TYPE).status(Response.Status.OK).build();
    }
}

现在,如果一切正常并且没有异常,代码执行路由器为userReg() -> MyRespWriter.writeTo()MyRespWriter.writeTo()的参数“注释”包含方法userReg()的正确注释,例如POSTPathProduces

但如果userReg()抛出异常,代码执行路由器为userReg() -> MyExceptionMapper.toResponse() -> MyRespWriter.writeTo(),则方法MyRespWriter.writeTo()的参数“注释”没有方法userReg()的注释。 / p>

我想知道,MyRespWriter.writeTo()是否可以一直检索原始注释?

1 个答案:

答案 0 :(得分:1)

您可以注入ResourceInfo,然后使用Method获取ri.getResourceMethod(),然后拨打method.getAnnotations()以获取注释。

public class MyRespWriter implements MessageBodyWriter<JsonResp> {

    @Context
    ResourceInfo ri;

    ...

    Annotations[] annos = ri.getResourceMethod().getAnnotations();