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