Springboot与Jpa整合问题

主要包括两个问题:

1、查询结果转换json时出现异常:

Could not write JSON: No serializer found for class
 org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to 
create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS); 
nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for 
class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to 
create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) 
(through reference chain: 
xxxx->xxxx->java.util.Collections$UnmodifiableRandomAccessList[0]->xxxxx[\"xxxxx\"]->xxxxx_$$_jvst928_69[\"handler\"])"

其实解决这种问题有几种方案,目前说两种:

    a.在实体类上加上注解,但是会导致新的问题,那就是关联的对象加上FetchType.LAZY不起作用了。当然这个注解不用加在每个实体上,写一个接口去实现就行。

@JsonIgnoreProperties({ "handler","hibernateLazyInitializer","fieldHandler"})

  b.第二种方案,则是通过Hibernate4Module

 添加依赖jar

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate4</artifactId>
    <version>2.9.8</version>
</dependency>

编写类

public class HibernateAwareObjectMapper extends ObjectMapper {

    public HibernateAwareObjectMapper(){
        Hibernate4Module hibernate4Module = new Hibernate4Module();
        hibernate4Module.configure(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION, false);
        registerModule(hibernate4Module);
    }

    public void setPrettyPrint(boolean prettyPrint) {
        configure(SerializationFeature.INDENT_OUTPUT, prettyPrint);
    }
}

添加到MessageConverter中

@Bean
public MappingJackson2HttpMessageConverter messageConverter(){
    HibernateAwareObjectMapper hibernateAwareObjectMapper = new HibernateAwareObjectMapper();
    MappingJackson2HttpMessageConverter HttpMessageConverter = new MappingJackson2HttpMessageConverter(hibernateAwareObjectMapper);
    return HttpMessageConverter;
}

但是延迟加载的数据如何查询出来,这就是第二个需要解决的问题了。

2、处理指定延迟对象加载方案:

@Override
public T getOne(Serializable id, String[] props) {
    T t = repository.findOne(id);
    getRelationObj(t, props);
    return t;
}

private void getRelationObj(T initializeObject, String[] props) {
    if(props!=null){
        for(String prop : props){
            getRelationObj(initializeObject, prop);
        }
    }
}

private void getRelationObj(T initializeObject, String prop) {
    try {
        if(StringUtils.isNotEmpty(prop)){
            Object obj = PropertyUtils.getProperty(initializeObject, prop);
            Hibernate.initialize(obj);
        }
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值