zalando 问题-spring-web 生成不需要的堆栈跟踪
zalando problem-spring-web generates unwanted stack trace
我正在尝试在我的 Spring 启动项目中使用 zalando 问题实现 RFC 7807-spring-web https://github.com/zalando/problem-spring-web
我已经按照这个指南完成了设置https://github.com/zalando/problem-spring-web/tree/master/problem-spring-web
当抛出异常时,确实会生成 Problem
实例,但其序列化的 JSON 形式并不符合预期,最值得注意的是,堆栈跟踪在不应该包含的情况下包含在内。
经过一些调试,似乎ProblemModule
没有注册到用于序列化问题的ObjectMapper
中(它的setupModule
方法从未被调用)。我的印象是声明一个 Module
类型的 bean 足以让 Spring 获取它并在 ObjectMapper
中注册,但它不会在这里发生。
文档说
In case you want to enable stack traces, please configure your
ProblemModule as follows:
ObjectMapper mapper = new ObjectMapper()
.registerModule(new ProblemModule().withStackTraces());
这似乎意味着您需要实例化您自己的 ObjectMapper
,但是如何确保它在反序列化问题时被库使用?
因为我无法让 ObjectMapper
注册我的 Module
,所以我想我必须自己做,所以我想出了这个似乎有效的解决方案:
@Configuration
public class ProblemConfiguration implements InitializingBean {
@Autowired
ObjectMapper objectMapper;
@Override
public void afterPropertiesSet() {
objectMapper.registerModules(
new ProblemModule(),
new ConstraintViolationProblemModule()
);
}
}
如果有人知道为什么它没有按预期工作,我会很高兴听到:)
自 Spring 启动 1.1.0 以来,JacksonAutoConfiguration 创建一个 ObjectMapper bean 并自动注册在您注册的 bean 中找到的所有模块,
因此您只需要创建两个 bean 模块并像这样使用已配置的 ObjectMapper:
/*
* Module for serialization/deserialization of RFC7807 Problem.
*/
@Bean
public ProblemModule problemModule() {
return new ProblemModule();
}
/*
* Module for serialization/deserialization of ConstraintViolationProblem.
*/
@Bean
public ConstraintViolationProblemModule constraintViolationProblemModule() {
return new ConstraintViolationProblemModule();
}
在服务 Classe 中为 ex 使用配置的 ObjectMapper
@Autowired
ObjectMapper jacksonObjectMapper
我正在尝试在我的 Spring 启动项目中使用 zalando 问题实现 RFC 7807-spring-web https://github.com/zalando/problem-spring-web
我已经按照这个指南完成了设置https://github.com/zalando/problem-spring-web/tree/master/problem-spring-web
当抛出异常时,确实会生成 Problem
实例,但其序列化的 JSON 形式并不符合预期,最值得注意的是,堆栈跟踪在不应该包含的情况下包含在内。
经过一些调试,似乎ProblemModule
没有注册到用于序列化问题的ObjectMapper
中(它的setupModule
方法从未被调用)。我的印象是声明一个 Module
类型的 bean 足以让 Spring 获取它并在 ObjectMapper
中注册,但它不会在这里发生。
文档说
In case you want to enable stack traces, please configure your ProblemModule as follows:
ObjectMapper mapper = new ObjectMapper()
.registerModule(new ProblemModule().withStackTraces());
这似乎意味着您需要实例化您自己的 ObjectMapper
,但是如何确保它在反序列化问题时被库使用?
因为我无法让 ObjectMapper
注册我的 Module
,所以我想我必须自己做,所以我想出了这个似乎有效的解决方案:
@Configuration
public class ProblemConfiguration implements InitializingBean {
@Autowired
ObjectMapper objectMapper;
@Override
public void afterPropertiesSet() {
objectMapper.registerModules(
new ProblemModule(),
new ConstraintViolationProblemModule()
);
}
}
如果有人知道为什么它没有按预期工作,我会很高兴听到:)
自 Spring 启动 1.1.0 以来,JacksonAutoConfiguration 创建一个 ObjectMapper bean 并自动注册在您注册的 bean 中找到的所有模块,
因此您只需要创建两个 bean 模块并像这样使用已配置的 ObjectMapper:
/*
* Module for serialization/deserialization of RFC7807 Problem.
*/
@Bean
public ProblemModule problemModule() {
return new ProblemModule();
}
/*
* Module for serialization/deserialization of ConstraintViolationProblem.
*/
@Bean
public ConstraintViolationProblemModule constraintViolationProblemModule() {
return new ConstraintViolationProblemModule();
}
在服务 Classe 中为 ex 使用配置的 ObjectMapper
@Autowired
ObjectMapper jacksonObjectMapper