Skip to content

chore: upgrade to spring 4.x#2067

Merged
triceo merged 9 commits intoTimefoldAI:mainfrom
zepfred:feat/spring4
Feb 11, 2026
Merged

chore: upgrade to spring 4.x#2067
triceo merged 9 commits intoTimefoldAI:mainfrom
zepfred:feat/spring4

Conversation

@zepfred
Copy link
Contributor

@zepfred zepfred commented Jan 30, 2026

This pull request upgrades Spring to version 4. The new spring version now defaults to Jackson 3, while Quarkus 3.x continues to use Jackson 2.

The proposed updates upgrade the current Jackson module to version 3 and move the Jackson 2 logic to the module quarkus-jackson. As a result, the solver codebase and the Spring module now operate with Jackson 3, while the Quarkus integration remains on Jackson 2.

Once Quarkus starts using Jackson 3, we will remove the Jackson 2 logic and use the Jackson 3 module instead.

Copy link
Collaborator

@triceo triceo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO this approach is too much hassle for the user. I propose we do something else instead:

  • We fork the jackson persistence module, create jackson2 and jackson3.
  • Quarkus depends on jackson2.
  • Spring Boot depends on jackson3.
  • Hopefully one day we'll get to delete jackson2.

There will be some code duplication, but not that much. These modules are small. And the benefit is obvious - the user doesn't need to configure anything, or worry about this at all.

@triceo
Copy link
Collaborator

triceo commented Feb 6, 2026

On reflection:

  • The "jackson3" module should just be called "jackson". When we remove "jackson2", it will look significantly better.
  • From the outset, the "jackson2" module should be marked as deprecated in the module description. It should be made clear that this module would be removed the first chance we get, and that users should prefer to use the "jackson" module unless they need to use Quarkus 3.

Copy link
Collaborator

@triceo triceo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO the POM files need improving.

@zepfred
Copy link
Contributor Author

zepfred commented Feb 9, 2026

@triceo I've confirmed that native compilation works with GraalVM 25 for both Quarkus and Spring.

@zepfred zepfred marked this pull request as ready for review February 10, 2026 11:10
Copilot AI review requested due to automatic review settings February 10, 2026 11:10
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Upgrades the Spring integration to Spring Boot 4.x and restructures Jackson support so that the core + Spring side uses Jackson 3 (tools.jackson), while the Quarkus integration remains on Jackson 2 (com.fasterxml.jackson).

Changes:

  • Bump Spring Boot to 4.0.2 and update Spring persistence-related imports/dependencies (EntityScan/EntityScanner/etc.).
  • Migrate the existing persistence/jackson module to Jackson 3 (tools.jackson.*) and adjust tests accordingly.
  • Introduce/expand a Quarkus-specific Jackson 2 module (quarkus-jackson) with serializers/deserializers and round-trip tests.

Reviewed changes

Copilot reviewed 179 out of 181 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
spring-integration/spring-boot-starter/pom.xml Adds Spring Boot 4-related deps (spring-core exclusion + persistence module).
spring-integration/spring-boot-integration-test/src/main/resources/application.properties No functional change (formatting/whitespace normalization).
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/normal/NoConstraintsSpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/normal/EmptySpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/multimodule/MultiModuleSpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/missingsuppliervariable/MissingSupplierVariableSpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/inheritance/solution/ReplaceAnnotatedMemberSpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/inheritance/solution/OnlyChildAnnotatedSpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/inheritance/solution/OnlyBaseAnnotatedSpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/inheritance/solution/MultipleInheritanceSpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/inheritance/solution/BothAnnotatedSpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/inheritance/solution/BothAnnotatedAbstractSpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/inheritance/entity/MultipleBothAnnotatedMixedSpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/inheritance/entity/BothAnnotatedSpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/inheritance/entity/BothAnnotatedInterfaceSpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/dummy/MultipleSolutionsSpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/declarative/SupplierVariableSpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/test/java/ai/timefold/solver/spring/boot/autoconfigure/chained/ChainedSpringTestConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/main/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverBeanFactory.java Switches conditional Jackson wiring to Jackson 3 types (tools.jackson).
spring-integration/spring-boot-autoconfigure/src/main/java/ai/timefold/solver/spring/boot/autoconfigure/TimefoldSolverAutoConfiguration.java Updates EntityScan import location for Boot 4.
spring-integration/spring-boot-autoconfigure/src/main/java/ai/timefold/solver/spring/boot/autoconfigure/IncludeAbstractClassesEntityScanner.java Updates EntityScanner/EntityScanPackages imports for Boot 4.
spring-integration/spring-boot-autoconfigure/pom.xml Makes Jackson integration non-optional and adds Boot 4 persistence/logging dependencies.
quarkus-integration/quarkus-jackson/runtime/src/test/resources/logback-test.xml Adds test logback config to avoid classpath conflicts.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/testdomain/JacksonTestdataValue.java Adds Quarkus-Jackson2 test domain type (identity handling).
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/testdomain/JacksonTestdataSolution.java Adds Quarkus-Jackson2 test planning solution with score serialization.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/testdomain/JacksonTestdataObject.java Adds shared base for Quarkus-Jackson2 test domain objects.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/testdomain/JacksonTestdataEntity.java Adds Quarkus-Jackson2 test planning entity.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/solution/JacksonSolutionFileIOTest.java Adds file round-trip test for Quarkus JacksonSolutionFileIO.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/diff/PlanningSolutionDiffTest.java Adds serialization test for PlanningSolutionDiff in Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/SequenceRoundTripTest.java Adds round-trip tests for Sequence/Break/SequenceChain in Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/LoadBalanceRoundTripTest.java Adds LoadBalance serialization/deserialization coverage for Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/simplelong/SimpleLongScoreJacksonRoundTripTest.java Adds score round-trip tests (SimpleLongScore) for Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/simplebigdecimal/SimpleBigDecimalScoreJacksonRoundTripTest.java Adds score round-trip tests (SimpleBigDecimalScore) for Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/simple/SimpleScoreJacksonRoundTripTest.java Adds score round-trip tests (SimpleScore) for Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardsoftlong/HardSoftLongScoreJacksonRoundTripTest.java Adds score round-trip tests (HardSoftLongScore) for Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardsoftbigdecimal/HardSoftBigDecimalScoreJacksonRoundTripTest.java Adds score round-trip tests (HardSoftBigDecimalScore) for Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardsoft/HardSoftScoreJacksonRoundTripTest.java Adds score round-trip tests (HardSoftScore) for Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardmediumsoftlong/HardMediumSoftLongScoreJacksonRoundTripTest.java Adds score round-trip tests (HardMediumSoftLongScore) for Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardmediumsoftbigdecimal/HardMediumSoftBigDecimalScoreJacksonRoundTripTest.java Adds score round-trip tests (HardMediumSoftBigDecimalScore) for Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardmediumsoft/HardMediumSoftScoreJacksonRoundTripTest.java Adds score round-trip tests (HardMediumSoftScore) for Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/bendablelong/BendableLongScoreJacksonRoundTripTest.java Adds score round-trip tests (BendableLongScore) for Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/bendablebigdecimal/BendableBigDecimalScoreJacksonRoundTripTest.java Adds score round-trip tests (BendableBigDecimalScore) for Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/bendable/BendableScoreJacksonRoundTripTest.java Adds score round-trip tests (BendableScore) for Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/score/AbstractScoreJacksonRoundTripTest.java Adds shared score round-trip test helper for Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/test/java/ai/timefold/solver/quarkus/jackson/api/AbstractJacksonRoundTripTest.java Adds shared Jackson round-trip test helper for Quarkus module.
quarkus-integration/quarkus-jackson/runtime/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.Module Registers Quarkus TimefoldJacksonModule via ServiceLoader (Jackson 2).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/solution/JacksonSolutionFileIO.java Adds Quarkus-specific JSON SolutionFileIO (Jackson 2).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/diff/package-info.java Documents PlanningSolutionDiff Jackson2 serialization support for Quarkus.
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/diff/SerializablePlanningVariableDiff.java Adds serializable DTO for PlanningVariableDiff (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/diff/SerializablePlanningSolutionDiff.java Adds serializable DTO for PlanningSolutionDiff (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/diff/SerializablePlanningEntityDiff.java Adds serializable DTO for PlanningEntityDiff (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/diff/PlanningVariableDiffJacksonSerializer.java Adds serializer wiring for PlanningVariableDiff (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/diff/PlanningSolutionDiffJacksonSerializer.java Adds serializer wiring for PlanningSolutionDiff (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/diff/PlanningEntityDiffJacksonSerializer.java Adds serializer wiring for PlanningEntityDiff (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/solver/RecommendedFitJacksonSerializer.java Adds RecommendedFit serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/solver/RecommendedAssignmentJacksonSerializer.java Adds RecommendedAssignment serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/solver/AbstractRecommendedFitJacksonDeserializer.java Adds base deserializer for RecommendedFit (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/solver/AbstractRecommendedAssignmentJacksonDeserializer.java Adds base deserializer for RecommendedAssignment (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/package-info.java Documents Sequence/Break/LoadBalance serialization/deserialization (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/SerializableSequenceChain.java Adds serializable DTO for SequenceChain (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/SerializableSequence.java Adds serializable DTO for Sequence (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/SerializableLoadBalance.java Adds serializable DTO for LoadBalance (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/SerializableBreak.java Adds serializable DTO for Break (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/SequenceJacksonSerializer.java Adds Sequence serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/SequenceJacksonDeserializer.java Adds Sequence deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/SequenceChainJacksonSerializer.java Adds SequenceChain serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/SequenceChainJacksonDeserializer.java Adds SequenceChain deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/LoadBalanceJacksonSerializer.java Adds LoadBalance serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/LoadBalanceJacksonDeserializer.java Adds LoadBalance deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/DeserializableSequenceChain.java Adds deserializable SequenceChain implementation (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/DeserializableSequence.java Adds deserializable Sequence implementation (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/DeserializableLoadBalance.java Adds deserializable LoadBalance implementation (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/DeserializableBreak.java Adds deserializable Break implementation (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/BreakJacksonSerializer.java Adds Break serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/stream/common/BreakJacksonDeserializer.java Adds Break deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/package-info.java Adds package docs for score bindings (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/constraint/ConstraintRefJacksonSerializer.java Adds ConstraintRef serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/constraint/ConstraintRefJacksonDeserializer.java Adds ConstraintRef deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/simplelong/SimpleLongScoreJacksonSerializer.java Adds SimpleLongScore serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/simplelong/SimpleLongScoreJacksonDeserializer.java Adds SimpleLongScore deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/simplebigdecimal/SimpleBigDecimalScoreJacksonSerializer.java Adds SimpleBigDecimalScore serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/simplebigdecimal/SimpleBigDecimalScoreJacksonDeserializer.java Adds SimpleBigDecimalScore deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/simple/SimpleScoreJacksonSerializer.java Adds SimpleScore serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/simple/SimpleScoreJacksonDeserializer.java Adds SimpleScore deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardsoftlong/HardSoftLongScoreJacksonSerializer.java Adds HardSoftLongScore serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardsoftlong/HardSoftLongScoreJacksonDeserializer.java Adds HardSoftLongScore deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardsoftbigdecimal/HardSoftBigDecimalScoreJacksonSerializer.java Adds HardSoftBigDecimalScore serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardsoftbigdecimal/HardSoftBigDecimalScoreJacksonDeserializer.java Adds HardSoftBigDecimalScore deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardsoft/HardSoftScoreJacksonSerializer.java Adds HardSoftScore serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardsoft/HardSoftScoreJacksonDeserializer.java Adds HardSoftScore deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardmediumsoftlong/HardMediumSoftLongScoreJacksonSerializer.java Adds HardMediumSoftLongScore serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardmediumsoftlong/HardMediumSoftLongScoreJacksonDeserializer.java Adds HardMediumSoftLongScore deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardmediumsoftbigdecimal/HardMediumSoftBigDecimalScoreJacksonSerializer.java Adds HardMediumSoftBigDecimalScore serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardmediumsoftbigdecimal/HardMediumSoftBigDecimalScoreJacksonDeserializer.java Adds HardMediumSoftBigDecimalScore deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardmediumsoft/HardMediumSoftScoreJsonSerializer.java Adds HardMediumSoftScore serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/hardmediumsoft/HardMediumSoftScoreJacksonDeserializer.java Adds HardMediumSoftScore deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/bendablelong/BendableLongScoreJacksonSerializer.java Adds BendableLongScore serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/bendablelong/BendableLongScoreJacksonDeserializer.java Adds BendableLongScore deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/bendablebigdecimal/BendableBigDecimalScoreJacksonSerializer.java Adds BendableBigDecimalScore serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/bendablebigdecimal/BendableBigDecimalScoreJacksonDeserializer.java Adds BendableBigDecimalScore deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/bendable/BendableScoreJacksonSerializer.java Adds BendableScore serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/buildin/bendable/BendableScoreJacksonDeserializer.java Adds BendableScore deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/analysis/ScoreAnalysisJacksonSerializer.java Adds ScoreAnalysis serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/analysis/AbstractScoreAnalysisJacksonDeserializer.java Adds base ScoreAnalysis deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/PolymorphicScoreJacksonSerializer.java Adds polymorphic Score serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/PolymorphicScoreJacksonDeserializer.java Adds polymorphic Score deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/AbstractScoreJacksonSerializer.java Adds base score serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/score/AbstractScoreJacksonDeserializer.java Adds base score deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/package-info.java Adds package docs for Quarkus Jackson module.
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/domain/solution/ConstraintWeightOverridesSerializer.java Adds ConstraintWeightOverrides serializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/domain/solution/AbstractConstraintWeightOverridesDeserializer.java Adds base ConstraintWeightOverrides deserializer (Quarkus).
quarkus-integration/quarkus-jackson/runtime/src/main/java/ai/timefold/solver/quarkus/jackson/api/TimefoldJacksonModule.java Adds/updates Quarkus Jackson2 module registration for Timefold types.
quarkus-integration/quarkus-jackson/runtime/pom.xml Defines Quarkus runtime module deps (explicit Jackson2 + test deps).
quarkus-integration/quarkus-jackson/pom.xml Adds Jackson BOM management for Quarkus module.
quarkus-integration/quarkus-jackson/deployment/src/main/java/ai/timefold/solver/quarkus/jackson/deployment/TimefoldJacksonProcessor.java Points processor to new Quarkus Jackson module class.
quarkus-integration/quarkus-jackson/deployment/pom.xml Removes dependency on old jackson module; uses new quarkus-jackson runtime.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/testdomain/JacksonTestdataSolution.java Switches test annotations imports to Jackson 3 (tools.jackson).
persistence/jackson/src/test/java/ai/timefold/solver/jackson/preview/api/domain/solution/diff/PlanningSolutionDiffTest.java Updates tests for Jackson 3 types and ordering/feature changes.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/score/stream/common/SequenceRoundTripTest.java Updates round-trip tests for Jackson 3 builder/config differences.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/score/stream/common/LoadBalanceRoundTripTest.java Updates LoadBalance tests for Jackson 3 builder/config differences.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/score/buildin/simplelong/SimpleLongScoreJacksonRoundTripTest.java Updates Jackson annotation imports to tools.jackson.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/score/buildin/simplebigdecimal/SimpleBigDecimalScoreJacksonRoundTripTest.java Updates Jackson annotation imports to tools.jackson.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/score/buildin/simple/SimpleScoreJacksonRoundTripTest.java Updates Jackson annotation imports to tools.jackson.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/score/buildin/hardsoftlong/HardSoftLongScoreJacksonRoundTripTest.java Updates Jackson annotation imports to tools.jackson.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/score/buildin/hardsoftbigdecimal/HardSoftBigDecimalScoreJacksonRoundTripTest.java Updates Jackson annotation imports to tools.jackson.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/score/buildin/hardsoft/HardSoftScoreJacksonRoundTripTest.java Updates Jackson annotation imports to tools.jackson.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/score/buildin/hardmediumsoftlong/HardMediumSoftLongScoreJacksonRoundTripTest.java Updates Jackson annotation imports to tools.jackson.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/score/buildin/hardmediumsoftbigdecimal/HardMediumSoftBigDecimalScoreJacksonRoundTripTest.java Updates Jackson annotation imports to tools.jackson.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/score/buildin/hardmediumsoft/HardMediumSoftScoreJacksonRoundTripTest.java Updates Jackson annotation imports to tools.jackson.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/score/buildin/bendablelong/BendableLongScoreJacksonRoundTripTest.java Updates Jackson annotation imports to tools.jackson.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/score/buildin/bendablebigdecimal/BendableBigDecimalScoreJacksonRoundTripTest.java Updates Jackson annotation imports to tools.jackson.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/score/buildin/bendable/BendableScoreJacksonRoundTripTest.java Updates Jackson annotation imports to tools.jackson.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/score/AbstractScoreJacksonRoundTripTest.java Updates exception type/imports for Jackson 3.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/TimefoldJacksonModuleTest.java Updates ObjectMapper setup/builder usage for Jackson 3 and deserialization behavior.
persistence/jackson/src/test/java/ai/timefold/solver/jackson/api/AbstractJacksonRoundTripTest.java Updates exception type/imports for Jackson 3.
persistence/jackson/src/main/resources/META-INF/services/tools.jackson.databind.Module Registers Jackson 3 module via ServiceLoader (tools.jackson).
persistence/jackson/src/main/java/ai/timefold/solver/jackson/preview/api/domain/solution/diff/package-info.java Updates docs to reference tools.jackson ObjectMapper.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/preview/api/domain/solution/diff/PlanningVariableDiffJacksonSerializer.java Migrates diff serializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/preview/api/domain/solution/diff/PlanningSolutionDiffJacksonSerializer.java Migrates diff serializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/preview/api/domain/solution/diff/PlanningEntityDiffJacksonSerializer.java Migrates diff serializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/impl/domain/solution/JacksonSolutionFileIO.java Switches default mapper creation to JsonMapper builder with module discovery (Jackson 3).
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/solver/RecommendedFitJacksonSerializer.java Migrates serializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/solver/RecommendedAssignmentJacksonSerializer.java Migrates serializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/solver/AbstractRecommendedFitJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/solver/AbstractRecommendedAssignmentJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/stream/common/package-info.java Updates docs to reference tools.jackson ObjectMapper.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/stream/common/SequenceJacksonSerializer.java Migrates serializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/stream/common/SequenceJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/stream/common/SequenceChainJacksonSerializer.java Migrates serializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/stream/common/SequenceChainJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/stream/common/LoadBalanceJacksonSerializer.java Migrates serializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/stream/common/LoadBalanceJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/stream/common/BreakJacksonSerializer.java Migrates serializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/stream/common/BreakJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/constraint/ConstraintRefJacksonSerializer.java Migrates serializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/constraint/ConstraintRefJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/buildin/simplelong/SimpleLongScoreJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/buildin/simplebigdecimal/SimpleBigDecimalScoreJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/buildin/simple/SimpleScoreJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/buildin/hardsoftlong/HardSoftLongScoreJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/buildin/hardsoftbigdecimal/HardSoftBigDecimalScoreJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/buildin/hardsoft/HardSoftScoreJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/buildin/hardmediumsoftlong/HardMediumSoftLongScoreJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/buildin/hardmediumsoftbigdecimal/HardMediumSoftBigDecimalScoreJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/buildin/hardmediumsoft/HardMediumSoftScoreJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/buildin/bendablelong/BendableLongScoreJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/buildin/bendablebigdecimal/BendableBigDecimalScoreJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/buildin/bendable/BendableScoreJacksonDeserializer.java Migrates deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/analysis/ScoreAnalysisJacksonSerializer.java Migrates ScoreAnalysis serializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/analysis/AbstractScoreAnalysisJacksonDeserializer.java Migrates ScoreAnalysis deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/PolymorphicScoreJacksonSerializer.java Migrates polymorphic Score serializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/PolymorphicScoreJacksonDeserializer.java Migrates polymorphic Score deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/AbstractScoreJacksonSerializer.java Migrates base score serializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/AbstractScoreJacksonDeserializer.java Migrates base score deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/domain/solution/ConstraintWeightOverridesSerializer.java Migrates ConstraintWeightOverrides serializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/domain/solution/AbstractConstraintWeightOverridesDeserializer.java Migrates ConstraintWeightOverrides deserializer to Jackson 3 packages/APIs.
persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/TimefoldJacksonModule.java Updates module factory/signatures for Jackson 3 (tools.jackson).
persistence/jackson/pom.xml Renames module and switches Jackson deps to tools.jackson (Jackson 3).
build/build-parent/pom.xml Bumps Spring Boot version and introduces Jackson 2/3 version properties + tools.jackson BOM.
Comments suppressed due to low confidence (1)

persistence/jackson/src/main/java/ai/timefold/solver/jackson/api/score/PolymorphicScoreJacksonSerializer.java:20

  • Javadoc claims polymorphic Score JSON uses a "type" field (e.g. HARD_SOFT), but the implementation writes a single property keyed by the score class simple name; update the example/output description to match actual serialization (or change the serializer to match the documented format).
 * Jackson binding support for a {@link Score} type (but not a subtype).
 * For a {@link Score} subtype field, use {@link HardSoftScoreJacksonSerializer} or similar instead.
 * <p>
 * For example: use
 * {@code @JsonSerialize(using = PolymorphicScoreJacksonSerializer.class) @JsonDeserialize(using = PolymorphicScoreJacksonDeserializer.class)}
 * on a {@code Score score} field which contains a {@link HardSoftScore} instance
 * and it will marshalled to JSON as {@code "score":{"type":"HARD_SOFT",score:"-999hard/-999soft"}}.
 *

Copilot AI review requested due to automatic review settings February 10, 2026 11:49
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 181 out of 183 changed files in this pull request and generated 3 comments.

Copy link
Collaborator

@triceo triceo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM when comments resolved.

Copilot AI review requested due to automatic review settings February 10, 2026 19:38
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 179 out of 181 changed files in this pull request and generated 1 comment.

@sonarqubecloud
Copy link

Quality Gate Failed Quality Gate failed

Failed conditions
9.0% Duplication on New Code (required ≤ 5%)

See analysis details on SonarQube Cloud

@triceo triceo merged commit ded9ceb into TimefoldAI:main Feb 11, 2026
20 of 24 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants