gpt4 book ai didi

java - 在 Jersey 中,如何处理深度嵌套的复杂对象的 @POST 参数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:09 24 4
gpt4 key购买 nike

我在这里使用的是 Jersey 1.x,我有一个 @POST 方法,它需要发送一个深度嵌套的复杂对象。我不确定我的所有选择,但似乎很多都是 described in this documentation :

In general the Java type of the method parameter may:

  1. Be a primitive type;

  2. Have a constructor that accepts a single String argument;

  3. Have a static method named valueOf or fromString that accepts a single String argument (see, for example, Integer.valueOf(String) and java.util.UUID.fromString(String)); or

  4. Be List, Set or SortedSet, where T satisfies 2 or 3 above. The resulting collection is read-only.

理想情况下,我希望我可以定义这样的方法:

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Path("complexObject")
public void complexObject(@FormParam("complexObject") ComplexObject complexObject) throws Exception {

但我想只有当我的对象满足上述要求时我才能这样做(在我的情况下,它不满足)。对我来说,我似乎有一个选择。

选项 1:实现 fromString

实现上面的第 3 项。

选项 2:分段传入 complexObject

complexObject 分解成多个部分,这样参数就变成了这样:

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Path("complexObject")
public void complexObject(@FormParam("piece1") LessComplexPiece lessComplexPiece1,
@FormParam("piece2") LessComplexPiece lessComplexPiece2,
@FormParam("piece3") LessComplexPiece lessComplexPiece3) throws Exception {

如果 LessComplexPiece 不满足上述要求,这可能还不够。我想知道这里最好的选择是什么。在这种情况下,人们通常会做什么?以下是我能想到的优缺点:

实现fromString的缺点

  • 必须维护自定义反序列化器。每次修改类时,此反序列化器都可能会中断。一般来说,错误的风险更大。
  • 可能无法生成描述复杂对象各个部分的文档。我必须手写。
  • 对于复杂对象的每一部分,我都必须编写自己的转换和验证逻辑。
  • 我不确定发布数据会是什么样子。但是,这可能会使某人很难从网页表单调用 API。如果资源接受原语,那将很容易。 EG:complexObject=seralizedStringfirstName=JohnlastName=Smith
  • 您可能由于各种原因无法修改类(谢天谢地,这对我来说不是限制)

实现fromString的优点

  • 这可以避免使用带有大量参数的方法。这将使 API 使用起来不那么令人生畏。
  • 这个论点是我想在我的方法主体中工作的抽象级别:
  • 我不必手动将各个部分组合在一起(从技术上讲我会,它只需要在反序列化器方法中)
  • 反序列化器可以是一个可以自动执行该过程的库(XStream、gensen 等)并为我节省大量时间。这可以减轻错误风险。
  • 如果将对象展平以发送碎片,您可能会遇到“ namespace ”冲突。例如,假设发送一个 Employee。如果他有一个 Boss,您现在必须提供一个 EmployeeFirstName 和一个 BossFirstName。如果您只是反序列化一个对象,您可以适本地嵌套数据,而不必在参数名称中包含上下文。

那么我应该选择哪个选项呢?有没有我不知道的第三种选择?

最佳答案

我知道这个问题很老,但万一有人遇到这个问题,自 JAX-RS 2.0 以来有新的更好的解决方案。解决方案是@BeanParam。由于文档:

The annotation that may be used to inject custom JAX-RS "parameter aggregator" value object into a resource class field, property or resource method parameter. The JAX-RS runtime will instantiate the object and inject all it's fields and properties annotated with either one of the @XxxParam annotation (@PathParam, @FormParam ...) or the @Context annotation. For the POJO classes same instantiation and injection rules apply as in case of instantiation and injection of request-scoped root resource classes.

如果您正在寻找有关其工作原理的详细解释,请查看我找到的文章: http://java.dzone.com/articles/new-jax-rs-20-%E2%80%93-beanparam

关于java - 在 Jersey 中,如何处理深度嵌套的复杂对象的 @POST 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18619649/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com