我正在从 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 确实存在?
编辑 …
我正在将一个项目从 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)
为什么行为发生了变化?如何恢复旧的行为?我错过了什么吗?
我正在从 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 的默认跟踪上下文?
我添加了一个演示项目: …