小编Eya*_*ort的帖子

更新到 Spring Boot 2 后未注册 Jackson 模块

我正在从 Spring Boot 1.5.21 升级到 2.2.5。

我需要用来MonetaryModule反序列化休息调用,并取决于 Spring 的ObjectMapper.

我在某个@Configuration类(MonetaryModule正在扩展Module)中为此模块定义了这样一个 bean :

@Bean
public MonetaryModule monetaryModule() {
    return new MonetaryModule();
}
Run Code Online (Sandbox Code Playgroud)

我可以在/beans端点中看到它已创建。但是,它实际上并未加载到ObjectMapper. 在对 Spring 的代码进行了大量调试和挖掘之后,我得出的结论是JacksonAutoConfiguration. 它有一个名为的内部静态类JacksonObjectMapperBuilderConfiguration,其中有一个bean创建Jackson2ObjectMapperBuilder. 在创建过程中,有一个调用customize()最终会得到这个代码:

private void configureModules(Jackson2ObjectMapperBuilder builder) {
    Collection<Module> moduleBeans = getBeans(this.applicationContext, Module.class);
    builder.modulesToInstall(moduleBeans.toArray(new Module[0]));
}
Run Code Online (Sandbox Code Playgroud)

这段代码似乎负责将模块加载到 中ObjectMapper,问题是这Jackson2ObjectMapperBuilder实际上并没有被创建。它出现在/beans端点中,但事实上当我在那里断点时我没有到达断点。这解释了为什么模块没有加载到ObjectMapper.

问题是,为什么没有调用这段代码?为什么/bean表明 bean 确实存在?

编辑 …

java jackson jackson-modules spring-boot jackson-databind

7
推荐指数
1
解决办法
1081
查看次数

Flyway是否支持测试文件夹下的sql迁移?

我正在将一个项目从 Spring Boot 1.5.21 迁移到 2.2.5。我已遵循指南中的所有说明。但是,我对 Flyway 有疑问(从 4.2.0 升级到 6)。

以前,当我在 下有 sql 迁移文件时src/test/resources/db/migration,flyway 会将它们作为mvn clean install命令的一部分运行。现在,由于某种原因,它停止运行这些迁移(为了澄清,我说的是maven构建而不是运行应用程序时)。

我正在使用maven 3.6.3以下flyway-maven-plugin version 6.0.8配置(某些值是与此问题无关的标记):

<plugin>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-maven-plugin</artifactId>
    <version>${flyway.version}</version>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>migrate</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <skip>${db.skip}</skip>
        <url>${db.url}</url>
        <user>${db.username}</user>
        <password>${db.password}</password>
        <locations>
            <location>classpath:db/migration</location>
        </locations>
        <schemas>public,downstream</schemas>
        <outOfOrder>true</outOfOrder>
        <callbacks>
            db.migration.callback.PopulateControlFieldsFlywayCallback,db.migration.callback.UpdateReplicaIdentityFlywayCallback,db.migration.callback.UpdateSchemaHistoryTableFlywayCallback
        </callbacks>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>${postgresql.version}</version>
        </dependency>
    </dependencies>
</plugin>
Run Code Online (Sandbox Code Playgroud)

为什么行为发生了变化?如何恢复旧的行为?我错过了什么吗?

maven-3 flyway spring-boot spring-boot-maven-plugin

5
推荐指数
1
解决办法
1882
查看次数

使用 SpringBootTest 时如何在控制器中使用 span 初始化默认跟踪上下文

我正在从 Spring Boot 1.5.21 迁移到 2.2.5,并且在此过程中也从 spring-boot-cloud 版本 Edgware.SR6 迁移到 Hoxton.SR3。这一举动迫使我放弃了侦探自己实现的跟踪器/跨度模型,并接受了勇敢的新模型。但是,我的控制器集成测试有问题。

我有一个调用Edge了一个主类的微服务EdgeApplication,我使用 Spock 作为测试框架。我的代码包括以下测试类:

@ContextConfiguration(classes = EdgeApplication.class)
@SpringBootTest(classes = EdgeApplication.class)
@ActiveProfiles(profiles = ["test"])
@AutoConfigureMockMvc
class VerificationCodeControllerSpecIT extends Specification {

  @Autowired
  MockMvc mockMvc

  def setup() {
     mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build()
  }

  def "Generate change password verification code"() {
    // Some code calling a PrincipalController via mockMvc.perform()
  }
}
Run Code Online (Sandbox Code Playgroud)

以前,在 Spring Boot 1.5.21 中,当调用到达 时PrincipalController,会初始化一个带有 span 的默认跟踪上下文。现在,在 Spring Boot 2 中,情况并非如此。我必须强调,这种缺乏上下文的PrincipalController情况只发生在测试代码中,而不是在微服务的实际运行中。

为什么这种行为改变了,我怎样才能恢复旧的行为,即在调用控制器时有一个带有 span 的默认跟踪上下文?

我添加了一个演示项目: …

groovy spring-boot spring-cloud-sleuth spring-boot-test

5
推荐指数
1
解决办法
687
查看次数