【问题标题】:JAX-RS - how to get multiple representations/projections of resource?JAX-RS - 如何获得资源的多个表示/投影?
【发布时间】:2014-10-03 15:02:52
【问题描述】:

场景:

  • 这是一个使用普通 JavaEE 7 的 REST API
  • 有一个Person 实体
  • GET /persons 返回所有人的列表
  • GET /persons/{id} 返回一个人

现在我希望这些 API 端点返回实体的不同表示:

  • /persons 应该只返回 id, firstName, lastName
  • /persons/{id} 应该返回所有字段

我已经想到的:

  • DTO 方法:创建一个只有 idfirstNamelastName 字段的 PersonSummary 类。然后使用推土机(或其他映射器)从Person -> PersonSummary 复制字段。然后返回PersonSummary 对象列表。

  • 使用javax.json.Json手动组装返回的对象。但这样我只能得到 JSON,没有更多的 XML :(

  • XML 模式文件:(不知道这是否真的可行)为每个表示编写一个.xsd 文件并让 Jaxb 处理生成的表示。

    李>

到目前为止我所看到的:


有没有一种(简单的)方法可以用 JavaEE 做到这一点?或者有一些不错的外部库吗?


编辑:运行时注释操作

你怎么看这个想法(这基本上就像杰克逊的@JsonView):

@XmlRootElement
public class MyClass {
  @MyViewAnnotation @MyOtherViewAnnotation
  String s1;

  String s2;

  @MyViewAnnotation
  String s3;
}

怎么办? (伪代码)

// resource object comes from some JAX-RS interceptor along
// with the preferred view annotation (in this case @MyViewAnnotation)

Annotation viewAnnotation = @MyViewAnnotation;

for(Field f : resource) {
  if(f.hasAnnotation(viewAnnotation)) {
    f.addAnnotation(@XmlElement);
  } else {
    f.addAnnotation(@XmlTransient);
  }
}

// return manipulated resource object back to JAX-RS

预期结果:

  1. 传递@MyViewAnnotation时,会生成@XmlElement String s1@XmlElement String s2s3 将是 @XmlTransient

  2. 传递@MyOtherViewAnnotation时,会在s1上生成@XmlElements2s3 将是 @XmlTransient

我不知道是否可以在正确的位置拦截 JAX-RS 处理以创建修改后的类,然后将该类传递给正常的 JAX-RS 处理。但这样一来,就可以轻松完成,而且 JAX-RS 可以以同样的方式生成 JSON 和 XML。

有什么想法吗?

【问题讨论】:

    标签: jakarta-ee jaxb jax-rs projection jaxb2


    【解决方案1】:

    我能想到的在 JAX-RS 中支持此行为的唯一方法是使用具有特殊内容类型的自定义 MessageBodyWriter,例如application/json+listapplication/json+details。然后在您的MessageBodyWriter 中仅序列化那些特定字段。

    但是,假设您使用 Jackson JAX-RS 提供程序,Jackson 视图方法似乎是最适合您需要的方法。您也可以使用 @JsonSerialize(include=NON_NULL) 并在列表视图中将其他字段设置为 null,从而获得相同的结果。但是,这仍然是 Jackson 特定的解决方案。

    我注意到您的其他两个解决方案,您使用以数据库为中心的方法。我假设这个对象实际上不在您的数据库中。

    【讨论】:

    • 感谢您的回答。但我认为MessageBodyWriter 不太适合:我必须为每种内容类型编写n 实现(或switch-case 或其他),一个用于JSON,一个用于XML,等等。如果我我请纠正我错了。 ...几分钟前,另一个疯狂的想法出现在我的脑海中:通过反射进行注释操作呢?几分钟后,我将在我的问题中附加一个示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多