【问题标题】:Deserialization of Polymorphic types with Jersey default implementation: MOXy使用 Jersey 默认实现的多态类型的反序列化:MOXy
【发布时间】:2015-05-07 09:36:48
【问题描述】:

我所有的实体都继承自一个名为 EntidadeBase 的类:

@MappedSuperclass
public abstract class EntidadeBase implements Serializable {

private static final long serialVersionUID = -3912856473903279467L;

@Id
@QueryParam("id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@PodamStrategyValue(value = NullStrategy.class)
private Long id;

@Column(name = "cadastro_data", nullable = false)
@PodamStrategyValue(value = PastDateStrategy.class)
private LocalDate dataCadastro;

@Column(name = "modificado_data", nullable = false)
@PodamStrategyValue(value = PastDateStrategy.class)
private LocalDate dataModificacao;

@QueryParam("modificado")
@Column(nullable = false)
@PodamBooleanValue(boolValue = false)
private Boolean modificado;

@QueryParam("ativo")
@Column(nullable = false)
@PodamBooleanValue(boolValue = true)
private Boolean ativo;
}

它是部署在 tomcat 8 上的 JAX-RS/Jersey Web 服务,实际上使用默认 Jersey impl 进行 POJO 绑定:MOXy。

我的问题是,例如,当我发送一个包含 JSON 实体的 PUT 请求时,EntidadeBase 字段不会解析为我的 EndPoint 对象

这是一个例子:

@PUT
@Override
@Transactional(qualifier = ForTransaction.class)
public Response atualizar(@NotNull Abrangencia entidade) {
    return super.atualizar(entidade);
}

如何让 MOXy 将 JSON 值解析为继承的超类的字段?

【问题讨论】:

  • 我的建议是切换到杰克逊图书馆
  • 谢谢,我做到了,现在它可以工作了@AntonioBalduzzi:D

标签: java json jersey moxy jsonschema2pojo


【解决方案1】:

首先,here 声明,您应该添加依赖项以启用 MOXy:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.16</version>
</dependency>

然后,here 您可以看到将 MOXy 与 Jersey 结合使用的示例。您需要解析的 Bean 应该具有根注释 @XmlRootElement(即使对于 JSON :))。此外,类的可序列化成员应该在类中定义 getter 和 setter。

【讨论】:

  • 我已经添加了依赖项,我将它们作为 Xml 根元素但没有解决任何问题:(
  • @MarcosJ.CKichel 你添加了getter和setter吗?
  • 是的,我做到了。我刚刚在另一个使用 JEE 7 特性的 Wildfly impl 的项目上对其进行了测试,其中 JAX-RS 基于 RestEasy 和 Json - Pojo Binding 基于 Jackson(不是 100% 肯定),并且它在相同的实体原型上运行良好,所以我认为问题在于 Jersey + MOXy 如何进行解析,也许需要一些配置,但我无法在任何地方找到它。现在我正在努力将 Jackson 设置为 Json - Pojo Binder。如果这不起作用,我将尝试使用 RestEasy 而不是 Jersey .. @mkrakhin
  • 不,通常 MOXy 不需要任何额外的配置,只需要在 pom.xml 中的依赖。你用的是什么版本的泽西岛?
  • 2.16,我认为它是最新的,您是否已经测试过相同的场景? @mkrakhin
【解决方案2】:

花了一些时间尝试修复我的实体后,我使用另一个类似的原型进行了一些测试,该原型使用 Wildfly 8.2 Impl 来实现 Java EE 7 功能(RestEasy 用于 JAX-RS,Jackson 用于 Json-Pojo Bind)和相同的实体/资源/存储库原型,这就像一个魅力。然后我意识到问题出在 MOXy,所以我将我的项目配置为使用 Jackson。

我修改了我的 pom.xml 替换它:

<!-- MOXy -->
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>${moxy.version}</version>
</dependency>

用这个:

<!-- Jackson -->
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jackson.version}</version>
</dependency>

并将这个初始化参数添加到我的 web.xml:

 <servlet>
    <servlet-name>jax-rs</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

    <init-param>
       <param-name>org.glassfish.jersey.config.property.packages</param-name>
       <param-value>com.fasterxml.jackson.jaxrs</param-value>
    </init-param>

    ...

现在它可以工作了(-;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 2015-02-08
    • 2014-12-18
    相关资源
    最近更新 更多