Appendix — Internal / IM Framework Details (Part 1: §13 – §19D)
Parent doc:
upgrade-migration-guide-to-im-7-3-0.md
Confluence mirror: IM 7.2 → 7.3.0 — Appendix — Internal / IM Framework Details (Part 1: §13 – §19D)
Internal-only — IM framework developer reference. Customer integrators can skip this section.
13. Docker / Deployment Changes
Base Image
-
Old:
amazoncorretto:17-al2-jdk -
New:
cregistry.pricefx.eu/im/images/toolchains/corretto-mvn:25-202604150757 -
The only Dockerfile shipped at v7.3.0 is
integration-apps/integration-runner-app/src/main/docker/Dockerfile(the previous v7.2.0pricefx-integration-app/src/main/docker/Dockerfilewas removed when manual IM was retired). -
The
:25-…tag refers to the Pricefx toolchain image build identifier, not the Java major version — the JVM inside the image is Java 21.
CDS (Class Data Sharing) — NEW
Docker build now extracts fat JAR and creates a shared class archive for faster startup:
RUN JAR_FILE=$(ls -1 lib/integration-app-*.jar | grep -v sources | head -1) && \
java -Djarmode=tools -jar "$JAR_FILE" extract --destination app && \
timeout 120 java -Dspring.context.exit=onRefresh \
-XX:ArchiveClassesAtExit=app-cds.jsa \
-jar app/integration-app-*.jar || true
Runtime adds -XX:SharedArchiveFile=app-cds.jsa.
Bootstrap.yml Removal
COPY bootstrap.yml removed from Dockerfile.
DuckDB Cross-Platform
duckdb --version check skipped on arm64 during cross-platform builds.
Trust Store
chown im:customer removed from cacerts copy (simplified permissions).
CI/CD Changes
|
Change |
Details |
|---|---|
|
Docker-in-Docker |
|
|
Maven cache |
|
|
Trivy DB |
Explicit |
|
Tests |
|
|
Release versioning |
|
|
Pre-release tags |
New |
|
Trivy reporting |
Enhanced: shows unresolved, stale trivyignore entries, duplicates |
15. Open Gaps on the Feature Branch (Need Action)
The doc's breaking-change list was cross-checked against the feature/PFIMCORE-2956 branch codebase. The items below are the ones that are not yet addressed and need follow-up before release. (Items already fixed and items that don't apply to IM were tracked during development but are no longer carried in this doc.)
|
# |
Issue |
File(s) |
Details |
Severity |
|---|---|---|---|---|
|
1 |
|
|
Must rename to |
HIGH |
|
2 |
|
|
|
HIGH |
|
3 |
commons-collections v3 imports still widespread |
~18 occurrences in |
v3 jar ( |
MEDIUM |
|
4 |
No |
N/A |
Lombok 1.18.38+ stopped auto-copying Jackson annotations ( |
MEDIUM |
|
5 |
|
|
Spring Boot 3.4 changed default from |
LOW |
|
6 |
HTTP redirect following default |
WebClient usage in |
Spring Boot 3.4 enables redirect following by default for all HTTP clients. If IM communicates with servers returning 3xx that should NOT be followed, add |
LOW |
|
7 |
|
|
Spring Boot 3.4 reworked actuator access: |
LOW |
16. Spring Boot 3.1.5 → 3.5.12
Impact: HIGH | Type: Configuration, API, Behavior
This spans Spring Boot 3.2, 3.3, 3.4, and 3.5 — each introduced breaking changes.
16.1 Property Changes
|
Old Property |
New Property |
Version |
Notes |
|---|---|---|---|
|
|
|
3.5 |
Renamed |
|
|
|
3.5 |
Renamed |
|
N/A |
|
3.4 |
New default (was |
|
N/A |
|
3.2 |
App name now appears in log output by default |
|
N/A |
|
3.4 |
New default. All HTTP clients (RestTemplate, RestClient, WebClient) follow redirects by default. |
|
N/A |
Boolean |
3.5 |
Only |
16.2 Deprecated / Removed APIs
|
API |
Status |
Version |
Replacement |
|---|---|---|---|
|
|
Removed |
3.2 |
|
|
|
Removed |
3.2 |
|
|
|
Removed |
3.2 |
|
|
|
Removed |
3.5 |
Implement |
|
|
Changed |
3.4 |
Use |
|
|
Removed |
3.4 |
Removed |
|
|
Deprecated |
3.4 |
Use |
|
|
Deprecated |
3.4 |
|
|
|
Deprecated |
3.4 |
|
|
|
Behavior changed |
3.4 |
Removed from configurations |
16.3 Actuator Changes (Spring Boot 3.2+)
-
Info endpoint contributors require explicit enablement:
management.info.java.enabled=true management.info.build.enabled=true management.info.git.enabled=truePreviously these were auto-enabled.
16.4 Spring Boot 3.2: Observability Auto-Configuration
-
Micrometer Observation API is auto-configured.
-
New
@Observedannotation support. -
May affect custom metrics.
16.5 Spring Boot 3.3: SSL Bundle Improvements
-
SSL auto-configuration changes for TLS/SSL keystores.
-
New
spring.ssl.bundle.*properties.
16.6 Spring Boot 3.4: RestClient and HTTP Client
-
RestClientis the new preferred HTTP client (replacesRestTemplatefor new code). -
HttpComponentsClientHttpRequestFactorynow uses HttpClient 5 by default. -
spring.http.client.*properties introduced for unified HTTP client configuration.
16.7 Spring Boot 3.4: Actuator Endpoint Access Model Reworked
-
Old properties:
management.endpoints.enabled-by-default,management.endpoint.<id>.enabled -
New properties:
management.endpoints.access.default(values:none/read-only/unrestricted),management.endpoint.<id>.access -
Heapdump endpoint defaults to
access=NONEin 3.5.
16.8 Spring Boot 3.5: Strict Boolean Properties
-
Boolean
.enabledproperties now only accepttrue/false. Values likeyes,on,1,off,no,0are rejected.
16.9 Spring Boot 3.5: taskExecutor Bean Alias Removed
-
Only
applicationTaskExecutoris provided. Code using@Qualifier("taskExecutor")orgetBean("taskExecutor")must update.
16.10 Spring Boot 3.5: HikariCP 6.x
-
If overriding
getPassword()inHikariDataSource, must also overridegetCredentials(). -
JDBC 4.3
beginRequest()/endRequest()support added.
16.11 Spring Boot 3.2: -parameters Compiler Flag Required
-
Spring Framework 6.1 removed
LocalVariableTableParameterNameDiscoverer. Without-parameters, DI by parameter name,@PathVariable,@RequestParam, SpEL#paramNameall break. -
IM Status: Already configured in
maven-compiler-plugin.
16.12 Spring Boot 3.2: Nested JAR URL Format Changed
-
Old:
jar:file:/dir/myjar.jar:BOOT-INF/lib/nested.jar!/... -
New:
jar:nested:/dir/myjar.jar/!BOOT-INF/lib/nested.jar!/... -
Launcher class renamed:
org.springframework.boot.loader.JarLauncher→org.springframework.boot.loader.launch.JarLauncher
IM Impact (Applied in Branch)
-
getRawStatusCode()→.getStatusCode().value()acrossV2_0.java,V3_1.java(HTTP client code). -
APPLICATION_JSON_UTF8_VALUE→APPLICATION_JSON_VALUEinConnectionsCompatibilityController.java. -
Base64Utils→java.util.Base64inMapperConfigurationService.java. -
WsConfigurerAdapter→WsConfigurerinWebServicesSpringAutoConfiguration.java. -
Security configuration completely refactored (see Spring Security section).
-
BuildPropertiesbean now optionally injected inCoreAutoConfiguration. -
Actuator info properties explicitly enabled in
default-application.properties. -
<executable>true</executable>removed fromspring-boot-maven-pluginin runner and pricefx-integration-app.
17. Spring Framework 6.0 → 6.2
Impact: MEDIUM | Type: API, Behavior
Key Changes
-
PathPatternParseris the default for URL pattern matching in Spring MVC (replacesAntPathMatcher). This is the reason for the security matcher migration. -
@Nullableannotations tightened: Some previously nullable return types are now non-null. -
WebMvcConfigurationSupportchanges: Some internal method signatures changed. -
Property placeholder parser rewritten (6.2): Keys containing
:must be escaped (${sub\\://host}). Placeholders can be escaped (\\${test}→ literal${test}). -
Bean definition overriding stricter (6.2): Component scanning with
REGISTER_BEANconditions fails hard. Setspring.main.allow-bean-definition-overriding=trueif needed. -
Invalid
@Configurationrejected (6.2): Rejects@Beanmethods withvoidreturn types and@Beanmethods with@Autowired. -
Autowiring algorithm revised (6.2):
@Qualifierand parameter name matches now take precedence over@Priority. -
Built-in method validation (6.1): Spring MVC now performs parameter-level validation automatically. May cause
MethodValidationExceptioninstead of argument resolver validation. -
ClientHttpRequestFactoryno longer buffers (6.1):Content-Lengthmay not be set for unknown-size content. -
throwExceptionIfNoHandlerFounddefaults totrue(6.1): RaisesNoHandlerFoundException(404) by default.
IM Impact (Applied in Branch)
-
Security matchers migrated from
AntPathRequestMatcher/MvcRequestMatcherto string-basedrequestMatchers()andPathPatternRequestMatcher. -
@NotNull(JetBrainsorg.jetbrains.annotations.NotNull) replaced with@Nonnull(Jakartajakarta.annotation.Nonnull) in some places. -
javax.annotation.PostConstruct→jakarta.annotation.PostConstruct.
18. Spring Security 6.1 → 6.5
Impact: HIGH | Type: API, Security Configuration
18.1 Removed / Changed APIs
|
Change |
Version |
Details |
|---|---|---|
|
|
6.4 |
Use |
|
|
6.4 |
Use |
|
|
6.4 |
HTTPS enforcement handled differently (reverse proxy / load balancer layer) |
|
|
6.4 |
No longer needed |
|
|
6.4 |
Now takes |
|
|
6.4 |
Matchers self-configure |
|
|
6.4 |
Simplified |
18.2 Security Configuration Pattern Change
Before (IM 7.2):
public SecurityFilterChain filterChain(HttpSecurity http, HandlerMappingIntrospector introspector, ...) {
http.requiresChannel(x -> x.anyRequest().requiresSecure())
.authorizeHttpRequests(x -> {
x.requestMatchers(AntPathRequestMatcher.antMatcher("/ws/**.wsdl")).permitAll();
x.requestMatchers(mngmtMatcher(introspector, "/**")).hasRole(ROLE_API);
});
}
private static MvcRequestMatcher mngmtMatcher(HandlerMappingIntrospector introspector, String pattern) {
return new MvcRequestMatcher.Builder(introspector).pattern(pattern);
}
After (IM 7.3.0):
public SecurityFilterChain filterChain(HttpSecurity http, AuthenticationManager inMemoryManager, ..., PathMatcher mvcPathMatcher) {
http.authorizeHttpRequests(x -> {
x.requestMatchers("/health").permitAll();
x.requestMatchers("/ws/**.wsdl").permitAll();
x.requestMatchers("/**").hasRole(ROLE_API);
});
}
// mngmtMatcher() helper method DELETED
18.3 Authentication Resolver Change
// Old
new Tuple2<>(AntPathRequestMatcher.antMatcher(pattern), pricefxManager)
// New
new Tuple2<>(PathPatternRequestMatcher.withDefaults().matcher(pattern), pricefxManager)
IM Impact (Applied in Branch)
-
SecurityAutoConfiguration.javacompletely refactored:-
HandlerMappingIntrospectorremoved from method signature. -
requiresChannel()(HTTPS enforcement) removed entirely. -
All
AntPathRequestMatcher.antMatcher()replaced with string-basedrequestMatchers(). -
mngmtMatcher()helper method deleted. -
/healthendpoint explicitly permitted. -
DaoAuthenticationProviderconstructor changed to takeUserDetailsService.
-
-
RestAutoConfiguration.java:AntPathRequestMatcher.antMatcher()replaced with string-based matchers. -
Default security credentials now have fallback values:
${integration.user:admin}and${integration.password:${random.uuid}}.
19. Apache CXF 4.0.3 → 4.1.5
Impact: MEDIUM | Type: API, Dependencies
Changes
-
CXF version now managed via BOM in parent POM.
-
New explicit dependencies added to
pricefx-integration:-
cxf-rt-frontend-jaxws(JAX-WS frontend) -
cxf-rt-features-logging(CXF logging feature)
-
-
cxf-rt-transports-http-jettyno longer needs explicit version. -
CxfPayloadclass relocated toorg.apache.camel.component.cxf.commonpackage.
IM Impact (Applied in Branch)
-
WebServicesSpringAutoConfiguration:extends WsConfigurerAdapter→implements WsConfigurer. -
CxfPayloadProcessor.java:businessKeysMaxLengthshandling removed. -
XmlWithNamespaceSplitter.java: New CXF payload serialization viaTransformerFactory. -
New
serializeCxfPayload()method handlesCxfPayload<Element>→ XML String conversion.
19A. Eclipse Jetty 11 → 12 (transitive, EE10)
Impact: MEDIUM | Type: Major-version transitive bump driven by Camel/CXF
What changed (verified via mvn dependency:tree on pricefx-integration for both tags)
|
Artifact |
v7.2.0 |
v7.3.0 |
|---|---|---|
|
|
11.0.17 |
12.0.33 |
|
|
11.0.17 |
12.0.33 |
|
|
(not present) |
12.0.33 (new in Jetty 12 — split out of |
|
|
5.0.2 |
(removed) |
|
|
(not present) |
12.0.33 (new — EE10 deployment module) |
|
|
(not present) |
12.0.33 (new — pulled by |
|
|
11.0.17 |
(removed — replaced by |
Pulled in transitively via:
-
org.apache.cxf:cxf-rt-transports-http-jetty:4.1.5→ Jetty 12 core +jetty-ee10-servlet -
org.apache.camel:camel-jetty:4.18.1→ Jetty 12 core +jetty-ee10-servlets+ WebSocket variants
Jetty 11 → 12 — what's actually different
-
Servlet integration moved to a separate EE module: in Jetty 11, the Servlet API lived in
jetty-servlet; in Jetty 12 the core (jetty-server) is Servlet-agnostic and deployment-environment support is layered on viajetty-ee9-*(Servlet 5 /jakarta.servlet.*5.x) orjetty-ee10-*(Servlet 6 /jakarta.servlet.*6.x). IM 7.3.0 lands on EE10. -
HandlerCollection/HandlerWrapperremoved in favor ofHandler.Sequence/Handler.Wrapper. -
Request/ResponseAPI rewritten — Jetty's own request and response types no longer extendHttpServletRequest/HttpServletResponsedirectly; the Servlet bridge is in the EE10 module. -
HttpClientAPI tightened —Request.method(...)enum-based, removed deprecated string overloads. -
WebSocket API package change —
org.eclipse.jetty.websocket.*→org.eclipse.jetty.ee10.websocket.*for the Servlet integration path.
IM Impact
-
IM does not embed or configure Jetty directly. All Jetty usage is via
camel-jetty(route consumers/producers) andcxf-rt-transports-http-jetty(SOAP web service exposure). Both are upgraded along with their parent libraries. -
Customer routes that use plain
jetty:http://…endpoints continue to work — Camel insulates them from the major-version change. -
Customer impact: only customers who write Java/Groovy code that imports
org.eclipse.jetty.*directly need to migrate (e.g. customHandlersubclasses, customHttpClient, embedded Jetty servers). Such code is rare in IM integrations.
Restriction
-
The classpath is now Servlet 6 /
jakarta.servlet.*6.x via Jetty EE10. Code or libraries pinned tojakarta.servlet:5.xwill fail to resolve at runtime.
19B. CXF WS-Security: WSS4J / OpenSAML / Shibboleth chain (NEW — transitive)
Impact: LOW (mostly classpath bloat) | Type: Transitive additions via CXF 4.1.5
What's new (none of these existed in v7.2.0)
|
Group |
Artifact(s) |
Version |
|---|---|---|
|
|
|
4.0.1 |
|
|
|
5.1.6 |
|
|
|
9.1.6 |
|
|
|
4.0.4 |
|
|
|
3.10.9 |
|
|
|
5.5.2 |
Pulled in via cxf-rt-ws-security (transitive of CXF 4.1.5 — CXF 4.1 began transitively bundling WSS4J 4.x, which itself transitively pulls OpenSAML 5 / Shibboleth 9 / Santuario 4).
IM Impact
-
IM does not actively use WS-Security or SAML — these artifacts are dragged onto the runtime classpath whether IM uses them or not. The footprint is ~25 additional JARs (~12 MB).
-
No code change required. No customer action required.
-
Risk if customers embed or call CXF WS-Security: they should test SAML token validation and signed/encrypted SOAP, since the WSS4J 4.x and OpenSAML 5.x APIs differ from earlier versions.
Restriction
-
None for IM-internal code. Classpath bloat is the only practical effect.
19C. Prometheus client library replacement: simpleclient → prometheus-metrics
Impact: LOW for IM (uses Micrometer); MEDIUM for any customer code that imports the client library directly | Type: Library replacement
What changed
|
v7.2.0 (deprecated |
v7.3.0 (new OpenMetrics-aligned family) |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Pulled in via io.micrometer:micrometer-registry-prometheus (1.11.5 → 1.15.10), which switched its transitive dependency from the legacy simpleclient family to the new prometheus-metrics family in Micrometer 1.13+.
Prometheus 1.x vs simpleclient — what's different
-
simpleclient(started in 2014) is officially deprecated. The newprometheus-metricslibrary was rewritten in 2023 to be OpenMetrics-compliant and to align naming (counters end in_total, gauges use_ratio, etc.). -
Metric construction APIs have different builders:
-
Old:
Counter.build("name", "help").register() -
New:
Counter.builder().name("name").help("help").register(registry)
-
-
Exposition format has dedicated text/protobuf modules (
prometheus-metrics-exposition-formats).
IM Impact
-
IM does not import
io.prometheus.*directly anywhere — all Prometheus exposure is via Micrometer (MeterRegistry), which abstracts the library. Verified:git grep "io\.prometheus\." -- '*.java' '*.groovy'returns no IM hits. -
The
/actuator/prometheusendpoint output format is unchanged (still standard Prometheus text exposition); any external scraper continues to work. -
Customer impact: only customers who write Groovy/Java that imports
io.prometheus.client.simpleclient.*directly will break. Such code is rare. Migration: switch to the MicrometerMeterRegistryAPI or to theprometheus-metrics-corebuilder API.
Restriction
-
io.prometheus:simpleclient*artifacts are no longer on the classpath. Any direct usage will fail withClassNotFoundException.
19D. SnakeYAML 1.25 → 2.6
Impact: MEDIUM | Type: Major-version direct dependency bump in pricefx-integration
What changed
-
Direct dependency in
pricefx-integration/pom.xml:org.yaml:snakeyaml1.25→2.6. -
Also bumped transitively:
org.snakeyaml:snakeyaml-engine2.7 → 2.9 (separate library by the same author, used by Jackson YAML data format and Spring Boot YAML loaders).
SnakeYAML 1.x → 2.x — what's different
-
CVE-2022-1471 hardening: the
Constructorclass is replaced withSafeConstructoras the default. Arbitrary class instantiation from YAML now requires explicitly opting in viaLoaderOptions.setAllowedTags(...)or constructing withConstructordirectly. -
Yaml#load(InputStream)no longer accepts polymorphic types by default — attempts to deserialize into an arbitrary Java class will throwConstructorExceptionunless the class is on the allowed-tag list. -
API tightening:
LoaderOptionsandDumperOptionsare mandatory in many constructors that previously had no-arg variants. -
Yaml.loadAll()returnsIterable<Object>(wasIterable<? extends Object>— minor signature change). -
Deprecated APIs removed —
BaseConstructor#getSingleData()signature changed;MarkedYAMLExceptionfield exposure tightened.
IM Impact
-
IM uses SnakeYAML in two places: connection-definition deserialization (where types are known and explicit) and Camel YAML DSL parsing (Camel manages its own
Yamlinstance). -
Both call sites use type-bounded deserialization (
yaml.loadAs(Foo.class, …)-style orYaml.loadAs), which is safe-by-default in 2.x. No code change was needed infeature/PFIMCORE-2956, and the v7.2.0..v7.3.0 diff confirms there are noSafeConstructoropt-ins added — the existing call sites already meet the new defaults.
Customer impact / restriction
-
Customer Groovy scripts that load YAML with
new Yaml().load(...)against a genericObjectand rely on polymorphic class instantiation will throwConstructorException. The fix is to use typed loading (yaml.loadAs(MyClass.class, input)) or passLoaderOptions.setAllowedTags(...). -
Customer YAML files that contain
!!java.lang.…or!net.pricefx.…explicit class tags will be rejected by default.