Comments 5
С чего лучше начать по вашему миграцию?
Мой опыт:
RestTemplate -> RestClient
это не прямо SB4 миграция, но в 7 Спринге появились удобные @ImportHttpServices анотации, так что мы мигровали одновременно с SB4.
Проблема - @AutoConfigureMockRestServiceServer не работает если в контексте несколько груп. Моё решение
import org.springframework.boot.restclient.test.MockServerRestClientCustomizer;
import org.springframework.test.web.client.MockRestServiceServer;
import org.springframework.web.client.RestClient;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class MockServerRegistry {
private final Map<String, MockServerRestClientCustomizer> customizers = new ConcurrentHashMap<>();
private final Map<String, RestClient.Builder> builderByGroup = new ConcurrentHashMap<>();
public void put(String group, RestClient.Builder builder) {
builderByGroup.put(group, builder);
customizers.computeIfAbsent(group, _ -> new MockServerRestClientCustomizer()).customize(builder);
}
public MockRestServiceServer get(String group) {
RestClient.Builder builder = builderByGroup.get(group);
if (builder == null) {
throw new IllegalStateException("No builder for group: " + group);
}
return customizers.get(group).getServer(builder);
}
}
@Configuration
@SuppressWarnings("static-method")
public class TestConfiguration {
@Bean
MockServerRegistry groupRestClientBuildersRegistry() {
return new MockServerRegistry();
}
@Bean
RestClientHttpServiceGroupConfigurer groupConfigurer(MockServerRegistry registry) {
return groups -> groups.forEachGroup((group, builder, _) -> {
registry.put(group.name(), builder);
});
}
}
и в тесте
@Autowired
private MockServerRegistry mockServerRegistry;
///...
mockServerRegistry.get("my_group").
BTW property для base URL: spring.http.serviceclient.my_group.base-url
Jackson migration
Поменялись названия пропертей
SP3:
#Rest configuration (modules JavaTimeModule and Jdk8Module loads automaticaly)
#AfterburnerModule defined as a bean in the configuration
# Keep numeric timestamps (instead of ISO-8601 strings)
spring.jackson.serialization.write-dates-as-timestamps=true
# Milliseconds precision (not nanoseconds)
spring.jackson.serialization.write-date-timestamps-as-nanoseconds=false
spring.jackson.deserialization.read-date-timestamps-as-nanoseconds=false
# avoid locale/host drift
spring.jackson.time-zone=UTC
# Ignore unknown JSON properties on deserialization
spring.jackson.deserialization.fail-on-unknown-properties=false
# Exclude null/empty properties from serialization
spring.jackson.default-property-inclusion=non_empty
SB4:
#Jackson configuration
#BlackbirdModule defined as a bean in the configuration
# Keep numeric timestamps (instead of ISO-8601 strings)
spring.jackson.datatype.datetime.write-dates-as-timestamps=true
# Milliseconds precision (not nanoseconds)
spring.jackson.datatype.datetime.write-date-timestamps-as-nanoseconds=false
spring.jackson.datatype.datetime.read-date-timestamps-as-nanoseconds=false
# avoid locale/host drift
spring.jackson.time-zone=UTC
# Ignore unknown JSON properties on deserialization
spring.jackson.deserialization.fail-on-unknown-properties=false
# Exclude null/empty properties from serialization
spring.jackson.default-property-inclusion=non_empty
Все остальное по мелочам: например стартеры нормально решает АйЯй. Кстати ему можно отдать и финальную проверку. По-крайней мере у меня он нашел несколько вешей которыя я пропустил - типа устаревших пропертей, которые еще поддерживаются, но скоро будут удалены, и которые логично поменять в рамках миграции.
Миграция Spring Boot 3.x → 4.0: 5 реальных проблем (и как их решить)