前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Springboot与Jpa整合问题

Springboot与Jpa整合问题

作者头像
sucl
发布2019-08-07 11:55:02
8030
发布2019-08-07 11:55:02
举报
文章被收录于专栏:企业平台构建企业平台构建

主要包括两个问题:

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

代码语言:javascript
复制
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不起作用了。当然这个注解不用加在每个实体上,写一个接口去实现就行。

代码语言:javascript
复制
@JsonIgnoreProperties({ "handler","hibernateLazyInitializer","fieldHandler"})

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

添加依赖jar

代码语言:javascript
复制
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate4</artifactId>
    <version>2.9.8</version>
</dependency>

编写类

代码语言:javascript
复制
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中

代码语言:javascript
复制
@Bean
public MappingJackson2HttpMessageConverter messageConverter(){
    HibernateAwareObjectMapper hibernateAwareObjectMapper = new HibernateAwareObjectMapper();
    MappingJackson2HttpMessageConverter HttpMessageConverter = new MappingJackson2HttpMessageConverter(hibernateAwareObjectMapper);
    return HttpMessageConverter;
}

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

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

代码语言:javascript
复制
@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();
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档