使用Jersey默认实现的多态类型的反序列化:MOXy

时间:2015-03-05 21:03:25

标签: java json jersey moxy jsonschema2pojo

我的所有实体都从名为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 Webservice,实际上使用默认的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值解析为继承的超类的字段?

2 个答案:

答案 0 :(得分:0)

首先,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。

答案 1 :(得分:0)

在尝试修复我的实体后花了一些时间,我使用另一个类似的原型进行了一些测试,该原型使用Wildfly 8.2 Impl作为Java EE 7功能(RestEasy for JAX-RS with Jackson for 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>

并将此init参数添加到我的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>

    ...

现在可行( - ;