这是Spring中的一个常见错误,当尝试自动转换带有某些Hibernate代理的实体对象,但我不知道如何加载Spring云函数gcp适配器中的JacksonDataType Hibernate 5模块时。
@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();
}
}
如果我使用与正常Sping Boot项目相同的代码,则该模块可以工作,但在这种情况下,我在日志中发现适配器不使用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)
This is the entire log file
我的第一个解决方法是将Page对象更改为String,并手动使用Jacksonmapper。
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对象的替代方法,但我不喜欢使用此选项
2条答案
按热度按时间0pizxfdo1#
所以只要Gson在类路径上,它就会被赋予优先级,当然Google也是如此。请设置
spring.http.converters.preferred-json-mapper=jackson
属性来强制Jackson。gjmwrych2#
最后我用这段代码修复了
文档解释了Gson是默认的MessageConverter,但不清楚如何将gson更改为Jackson(更简单)。
https://docs.spring.io/spring-cloud-function/docs/current/reference/html/spring-cloud-function.html#_provided_messageconverters