gson Spring云函数(GCP适配器)引发Hibernate延迟无法初始化代理-无会话

9cbw7uwe  于 2022-11-06  发布在  Spring
关注(0)|答案(2)|浏览(162)

这是Spring中的一个常见错误,当尝试自动转换带有某些Hibernate代理的实体对象,但我不知道如何加载Spring云函数gcp适配器中的JacksonDataType Hibernate 5模块时。

  1. @SpringBootApplication
  2. @Log4j2
  3. public class Application {
  4. public static void main(String[] args) {
  5. SpringApplication.run(Application.class, args);
  6. }
  7. @Bean
  8. public WebMvcConfigurer corsConfigurer() {
  9. log.info("configurando cors");
  10. return new WebMvcConfigurer() {
  11. @Override
  12. public void addCorsMappings(CorsRegistry registry) {
  13. registry.addMapping("/**").allowedOrigins("*");
  14. }
  15. };
  16. }
  17. @Bean
  18. public Module datatypeHibernateModule() {
  19. log.info("Cargando modulo hibernate jackson");
  20. return new Hibernate5Module();
  21. }
  22. }

如果我使用与正常Sping Boot项目相同的代码,则该模块可以工作,但在这种情况下,我在日志中发现适配器不使用Jackson,它们实现了Gson

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

This is the entire log file
我的第一个解决方法是将Page对象更改为String,并手动使用Jacksonmapper。

  1. public class ObtenerEstados implements Function<Void, String> {
  2. @Autowired
  3. private EstadoService estadoService;
  4. @SneakyThrows
  5. @Override
  6. public String apply(Void unused) {
  7. Page<Estado> page = estadoService.buscarTodos(0, 33);
  8. ObjectMapper objectMapper = new ObjectMapper();
  9. objectMapper.registerModule(new Hibernate5Module());
  10. String objectAsString = objectMapper.writeValueAsString(page);
  11. return objectAsString;
  12. }
  13. }

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

如果您已经安装了Docker和Docker Compose,则可以轻松重现该错误。
请执行以下步骤:

  1. git clone https://github.com/ripper2hl/sepomex.git
  2. cd sepomex
  3. git checkout -b dev origin/functions
  4. docker-compose pull db
  5. docker-compose up -d db
  6. export spring_profiles_active=local
  7. mvn -Pgcp function:run

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

  1. curl http://localhost:8080/

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

0pizxfdo

0pizxfdo1#

所以只要Gson在类路径上,它就会被赋予优先级,当然Google也是如此。请设置spring.http.converters.preferred-json-mapper=jackson属性来强制Jackson。

gjmwrych

gjmwrych2#

最后我用这段代码修复了

  1. @SpringBootApplication
  2. public class Application {
  3. public static void main(String[] args) {
  4. SpringApplication.run(Application.class, args);
  5. }
  6. @Bean
  7. public JsonMessageConverter jsonMessageConverter() {
  8. ObjectMapper objectMapper = new ObjectMapper();
  9. objectMapper.registerModule(new Hibernate5Module());
  10. JacksonMapper jacksonMapper = new JacksonMapper(objectMapper);
  11. return new JsonMessageConverter(jacksonMapper);
  12. }
  13. }

文档解释了Gson是默认的MessageConverter,但不清楚如何将gson更改为Jackson(更简单)。
https://docs.spring.io/spring-cloud-function/docs/current/reference/html/spring-cloud-function.html#_provided_messageconverters

展开查看全部

相关问题