spring-boot - 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 对象的替代方法,但我不喜欢使用此选项
解决方案
因此,只要 Gson 在类路径上,它就会被优先考虑,当然 Google 也是如此。请设置spring.http.converters.preferred-json-mapper=jackson
属性强制杰克逊。
推荐阅读
- nginx - NGINX 将 HTTPS 从任何域转发到特定 URL
- c - 创建循环的缓存有效版本
- php - Laravel 中的自定义内容
- sql - Need query to return results even if duplicate
- android - 使用自定义 SearchView 过滤项目后,如何在 recyclerview 中获取当前项目位置
- tensorflow - 将多维 NumPy 数组与列表传递给 fit() 会引发错误
- automationanywhere - 如何获得一个月或一个月的最后一天的天数?无处不在的自动化
- batch-file - 寻找可以处理超过 65534 行文件的 MORE/MOVE 解决方案
- sql - 简单错误“ORA-00979:不是 GROUP BY 表达式”
- powershell - Powershell gci 在一个函数中。将带有通配符的文件名变量传递给函数