自定义注释,用于JAX-RS方法和从拦截器传递给JAX-RS方法的参数

时间:2018-09-18 21:22:05

标签: java java-ee jax-rs cdi resteasy

我将介绍一些更广泛的上下文来阐明我的用例...

我想实现自定义注释@FilterResponse来注释JAX-RS方法,以便过滤JSON响应中的字段。为了后一个目的,我使用了Jacksons的@JsonFilter机制。想法是允许使用点表示法在整个对象图中指定所需的字段,从返回的实体作为根开始。

例如,如果我有一个返回“产品”实体的方法,并且我只想返回“产品”中的“名称”字段和“产品”中相关实体的CharacteristicValues的“名称”字段,那么我将执行以下操作...

@GET
@Produces("application/json")
@Path("/{pid}")
@FilterResponse(include = {"name", "characteristicValues.name"}, responseEntityClass = Product.class)
public Response get(@PathParam("pid") Integer pid) {
    Product result = productService.findSimpleProduct(pid);
    return Response.ok().entity((result)).build();

}

在后台,在@FilterResponse批注的拦截器实现中,我执行ObjectMapper的所有必要转换和配置。

此外,在拦截器内部,我生成了一些对象,这些对象可用于其余的请求处理(在服务,DAO等中),因此我想传递在拦截器中创建的对象(例如,从@FilterResponse批注中指定的元数据创建的FieldTree对象)到拦截的JAX-RS方法... 这是我现在的问题。

更新:例如,可以使用传递的FieldTree来重建JPA EntityGraph,以便仅从数据库中获取首选字段。

这里是拦截器的伪鳕鱼,用以说明想法...

@FilterResponse
@Interceptor
public class FilterResponseInterceptor {


@AroundInvoke
public Object intercept(InvocationContext context) throws Exception {

    List<String> fieldsToRetain = getIncludeListFromFilterResponseAnottationIn(context);

    FeildTree fieldTree = createFieldTreeFrom(fieldsToRetain);
    passFieldTreeToMethodInContext(fieldTree, context);

    Object response = context.proceed();

    return filteredResponseWithFields(response, fieldsToRetain);
}}

当我尝试声明要从拦截器传递给拦截的JAX-RS方法的参数时,如下所示...

@GET
@Produces("application/json")
@Path("/{pid}")
@FilterResponse(include = {"name", "characteristicValues.name"}, responseEntityClass = Product.class)
public Response get(@PathParam("pid") Integer pid, FieldTree requestedFieldTree) {
    Product result = productService.findSimpleProduct(pid);
    return Response.ok().entity((result)).build();

}

...我遇到以下错误...

RESTEASY002010: Failed to execute: javax.ws.rs.NotSupportedException: RESTEASY003200: Could not find message body reader for type: class app.fieldsfiltering.FieldTree of content type: */*

是否有任何方法可以使RESTEasy忽略JAX-RS方法中的某些参数,或通过其他方法将参数传递给截获的JAX-RS方法?

很抱歉,我冗长的问题。

UPDATE2 :我的想法得到了一些澄清...我没有提到我要避免“琐碎”的DTO,这些DTO纯粹是从领域实体中选择某些字段而无需更改结构。所以...例如EntityGraph将在DAO或服务层中创建...但是,我觉得EntityGraph创建所必需的“元数​​据”(例如,我称为的首选字段图或FieldTree)应放在JAX-RS方法上。为什么?在那种情况下,我将把FieldTree传递给Service逻辑...然后,我将创建适当的EntityGraph并热切地获取具有FieldTree中定义的所有字段的域实体。然后,我将域实体返回给JAX-RS方法并仅保留字段定义在JSON响应中的FieldTree中,以避免LazyInitialization异常,如果Jackson尝试解析实体对象中的某些惰性字段,则会引发该异常。

0 个答案:

没有答案