如何使用Jackson注释(或任何其他方式)在反序列化中获取复杂数据?

时间:2016-10-18 00:26:57

标签: java json hibernate orm jackson

我使用带有json序列化/反序列化的实体模型来存储/检索数据。 我面临着反序列化Lazy加载数据的问题。

也就是说,我已经定义了我的实体,超类,这样的接口;

ATG课程

@Entity
@Table(name = "atg", uniqueConstraints = @UniqueConstraint(columnNames = "code"))
public class ATG extends ParentEntity {

    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "companyid")
    Manufacturer manufacturer;

    getManufacturer();
    setManufacturer();    
}

客户类

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Customer implements HasCustomer {

    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
    @JoinColumn(name = "customer2_id", nullable = true)
    private Customer customer;

    getCustomer();
    setCustomer();
}

ParentEntity

@MappedSuperclass
public abstract class ParentEntity implements  HasCustomer{

    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    @ManyToOne( fetch = FetchType.LAZY)
    @JoinColumn(name = "customer2_id", nullable = false)
    private Customer customer;

    getCustomer();
    setCustomer();
}

HasCustomer界面

public interface HasCustomer extends Serializable{

    public Customer getCustomer();

    public void setCustomer(final Customer customer);

    public Long getCustomerId();

    public void setCustomerId(final Long customerId);
}

Customer Class引用了客户对象(逻辑要求)。

我对服务端点进行REST调用以从数据库中检索数据。 Ide将这些复杂的数据类型细化为fetch = FetchType.LAZY。 当用户确实需要带有响应的数据时,他会指定。因此,在后端,我们通过设置FetchMode.JOIN来获取数据。 (这有效)。

唯一的问题是,Json注释。在这种情况下,我该如何指定注释? 如果我将jsonIgnore保持在一个级别,它可能会阻止结果,或者我不会在未请求用户获取复杂数据的情况下看到结果

我在所有getter,setter和变量定义中尝试了@jsonIgnore / @jsonproperty注释。 (我相信我尝试了所有组合:)

但没有人会回复所需的结果。

我想保留适当的注释,以便在拨打ATG服务时检索客户数据和制造商数据

有人可以帮帮我吗?

我使用jackson(com.fasterxml.jackson)V 2.6.3 hibernate v 5.2.1.Final。

1 个答案:

答案 0 :(得分:0)

我不确定你应该像这样使用杰克逊,但这可能有所帮助。

定义客户序列化程序

public class CustomerSerializer extends JsonDeserializer<Customer> {

   public Customer deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        ....
    }
}

然后在界面中使用它

@JsonDeserialize(using = CustomerSerializer.class)
public class Customer implements HasCustomer {