com.fasterxml.jackson.databind.JsonMappingException: No serializer found for

先说下场景,有个实体类是和其他实体关联的,关联的实体配置了延迟加载。查询出来后用Jackson转成json返回到前端。实际上是在springmvc中配置MappingJackson2HttpMessageConverter转换器。

Hibernate 两个实体关联的时候,可能会采用延迟加载。 当使用延迟加载时,如果关联的对象没有使用。那么它不是为null的。hibernate 会有一个代理对象,填充在里面。当你使用这个关联对象时(代理对象),这个对象可以查出原来这个关联对象的值。使用jackson去转化实体类时,如果实体类里面有代理对象,就会报标题的错误。现在还不知道为什么。但是可以知道解决方案是让转化的实体类不包含代理对象,一种解决方案是关闭延迟加载,而是自己把关联的对象设置进去,覆盖代理对象。第三种就是使用@JsonIgnore注解,让jackson不去转化这个关联对象。
下面看下实例
这是项目实体类,有个分类实体类和它是一对多的关系,项目是多,分类是一。

@SuppressWarnings("serial")
@Entity
@Table(name = "project", schema = "microcat", catalog = "")
public class ProjectEntity implements Serializable{
    private long id;
    private String name;
    private Timestamp createTime;
    private Timestamp editedTime;
    private UserEntity editor;
    private ClassificationEntity classification;


    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="EDITOR")

    public UserEntity getEditor() {
        return editor;
    }

    public void setEditor(UserEntity editor) {
        this.editor = editor;
    }

    @ManyToOne(fetch=FetchType.LAZY) // 第一种@ManyToOne(fetch=FetchType.EAGE)
    @JoinColumn(name="CLASSIFICATION")
    @JsonIgnore // 第二种方案
    public ClassificationEntity getClassification() {
        return classification;
    }

    public void setClassification(ClassificationEntity classification) {
        this.classification = classification;
    }

    @Id
    @Column(name = "ID")
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Basic
    @Column(name = "NAME")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Basic
    @Column(name = "CREATE_TIME")
    public Timestamp getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Timestamp createTime) {
        this.createTime = createTime;
    }

    @Basic
    @Column(name = "EDITED_TIME")
    public Timestamp getEditedTime() {
        return editedTime;
    }

    public void setEditedTime(Timestamp editedTime) {
        this.editedTime = editedTime;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        ProjectEntity that = (ProjectEntity) o;

        if (id != that.id) return false;
        if (name != null ? !name.equals(that.name) : that.name != null) return false;
        if (createTime != null ? !createTime.equals(that.createTime) : that.createTime != null) return false;
        if (editedTime != null ? !editedTime.equals(that.editedTime) : that.editedTime != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = (int) (id ^ (id >>> 32));
        result = 31 * result + (name != null ? name.hashCode() : 0);
        result = 31 * result + (createTime != null ? createTime.hashCode() : 0);
        result = 31 * result + (editedTime != null ? editedTime.hashCode() : 0);
        return result;
    }
}

未完待续

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Caused by: com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.alibaba.fastjson.JSONObject["file"]->org.springframework.core.io.ByteArrayResource["inputStream"]) at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:284) at com.fasterxml.jackson.databind.SerializerProvider.mappingException(SerializerProvider.java:1110) at com.fasterxml.jackson.databind.SerializerProvider.reportMappingProblem(SerializerProvider.java:1135) at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:69) at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:32) at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:704) at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:689) at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeFields(MapSerializer.java:633) at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:536) at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:30) at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292) at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2509) at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.writeInternal(MappingJackson2HttpMessageConverter.java:141)
06-15
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值