首页 > 解决方案 > Spring Cloud Function(GCP 适配器)抛出 Hibernate lazy 无法初始化代理 - 没有会话

问题描述

这是Spring在尝试使用一些休眠代理自动转换实体对象时的常见错误,但我不知道如何在Spring 云函数 gcp 适配器中加载Jackson DataType Hibernate5模块。

@SpringBootApplication
@Log4j2
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        log.info("configurando cors");
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedOrigins("*");
            }
        };
    }
    
    @Bean
    public Module datatypeHibernateModule() {
        log.info("Cargando modulo hibernate jackson");
        return new Hibernate5Module();
    }
}

如果我使用与普通Spring 引导项目相同的代码,则模块可以工作,但在这种情况下,我在日志中发现适配器没有使用Jackson,它们实现了Gson

        at com.google.gson.Gson.toJson(Gson.java:638)
        at com.google.gson.Gson.toJson(Gson.java:618)
        at org.springframework.cloud.function.json.GsonMapper.toJson(GsonMapper.java:70)

这是整个日志文件

我的第一个解决方法是更改​​ String 的 Page 对象并手动使用 jackson 映射器。

public class ObtenerEstados implements Function<Void, String> {
    
    @Autowired
    private EstadoService estadoService;
    
    @SneakyThrows
    @Override
    public String apply(Void unused) {
        Page<Estado> page = estadoService.buscarTodos(0, 33);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new Hibernate5Module());
        String objectAsString = objectMapper.writeValueAsString(page);
        return objectAsString;
    }
}

我在 Github 存储库上创建了两个分支

如果您已经安装了 Docker 和 Docker Compose,您可以轻松地重现该错误。

请按照以下步骤操作:

git clone https://github.com/ripper2hl/sepomex.git

cd sepomex 

git checkout -b dev origin/functions

docker-compose pull db

docker-compose up -d db

export spring_profiles_active=local

mvn -Pgcp function:run

并使用 curl 或任何 REST 客户端执行

curl http://localhost:8080/

我知道使用 DTO 对象的替代方法,但我不喜欢使用此选项

标签: spring-boothibernatejacksongsonspring-cloud-function

解决方案


因此,只要 Gson 在类路径上,它就会被优先考虑,当然 Google 也是如此。请设置spring.http.converters.preferred-json-mapper=jackson属性强制杰克逊。


推荐阅读