文件内容
references/manual-fix-checklist.md
# Manual Fix Checklist (After OpenRewrite)
## When to load this file
Load this file after running rewrite recipes and when compile/test failures remain.
## Stage output requirement
For each fix stage, always record:
1. Commands executed
2. Files/modules changed
3. Blocking issues
4. Validation result
## 1) Java and Runtime Baseline
- Ensure JDK 17+ is configured in **build** (e.g. `java.version` in pom, `sourceCompatibility` in Gradle) and in **CI** (e.g. GitHub Actions `java: '17'`, Jenkins JDK 17, GitLab CI image). Update CI config if it still uses Java 11 or 8.
- Ensure container/runtime images use Java 17+ (see **Dockerfile / container image** below).
## 2) Dockerfile / container image
- Align the **Java base image** in `Dockerfile` (or equivalent) with the target JDK (17 or 21). Boot 3 requires Java 17+.
- If the Dockerfile runs the app with **`java -jar`** (or `java -cp`), the **image** that runs that command must be Java 17+ (e.g. `eclipse-temurin:21-jdk` or `eclipse-temurin:21-jre`). The `java -jar` command itself does not need to change; only the runtime (base image) does. In multi-stage builds, upgrade the **final stage** image as well.
- **OpenRewrite**: Use the [rewrite-docker](https://github.com/openrewrite/rewrite-docker) module. Add dependency `org.openrewrite:rewrite-docker` and run the **Change Docker FROM** recipe to update the base image (e.g. `eclipse-temurin:11-jdk` → `eclipse-temurin:21-jdk`). See [OpenRewrite Docker recipes](https://docs.openrewrite.org/recipes/docker) and [references/openrewrite-recipes.md](openrewrite-recipes.md#dockerfile-upgrade).
- **Alternative**: Use a text-based recipe (e.g. `org.openrewrite.text.FindAndReplace`) with `filePattern: "**/Dockerfile"` to replace the image name/version if you only need a simple bump.
- Rebuild the image and run a quick container smoke test (e.g. start app, hit health endpoint).
## 3) `javax` -> `jakarta`
- Replace imports such as:
- `javax.servlet.*` -> `jakarta.servlet.*`
- `javax.validation.*` -> `jakarta.validation.*`
- `javax.persistence.*` -> `jakarta.persistence.*`
- Verify all related dependencies are Jakarta-compatible.
## 4) Spring Security Migration
- Replace `WebSecurityConfigurerAdapter` style config with `SecurityFilterChain` bean config.
- Re-check URL matchers and method security annotations for behavior drift.
- Re-test authentication and authorization flows.
## 5) Web and Serialization
- Check Spring MVC/WebFlux exception handling and binding behavior.
- Replace `WebMvcConfigurerAdapter` usage that might remain after recipe runs.
- Replace `HandlerInterceptorAdapter` usage that might remain after recipe runs.
- Re-check Jackson and date/time serialization compatibility.
- Re-validate custom converters, interceptors, and filters.
## 6) Data and Persistence
- Verify Hibernate/JPA version compatibility with Boot 3.
- Re-check generated SQL and schema management behavior.
- Test transaction boundaries and lazy-loading sensitive paths.
## 7) API Documentation and Observability
- If using Springfox, migrate to **springdoc-openapi 2.8.x** for Spring Boot 3.5 (use the 2.8.x release that matches your Boot 3.5.x). Do not use springdoc-openapi 3.0.0 with Boot 3.5—3.0.0 targets Spring Boot 4.
- Verify Micrometer/Actuator endpoint exposure and metric naming changes.
- Validate health/readiness/liveness endpoints used by deployment platform.
## 8) Dependency and HTTP stack
- Check HttpClient5/HttpCore5 version alignment to avoid runtime `NoSuchMethodError`.
- Validate `RestTemplate`/HTTP client bean construction and timeout settings.
- If `setReadTimeout` style code no longer works with target HTTP client APIs, migrate to `RequestConfig` + explicit timeout types.
- If the project uses **Spring Cloud**, align the Spring Cloud BOM version with Boot 3.5 (e.g. 2024.0.x). Check [Spring Cloud release train compatibility](https://spring.io/projects/spring-cloud) with the chosen Boot version.
- If the project uses **GraalVM native image** build, re-run the native build after migration and fix any new reflection or resource hints if needed.
## 9) Test and Framework API migration
- Confirm JUnit 4 remnants are fully migrated to JUnit 5 annotations and assertions.
- Re-check exception handlers that changed from `HttpStatus` parameters/return usage to `HttpStatusCode` patterns.
- Replace `APPLICATION_JSON_UTF8_VALUE` and similar removed constants.
## 10) Custom Recipe opportunity (repeatable fixes)
- For repeated internal API migration tasks, create custom OpenRewrite recipes instead of repeating manual edits.
- Typical candidates:
- Internal shared library package/class migration
- Cross-service annotation rename
- Repeated dependency version alignment
## 11) Test and Release Gate
- Run full test suite.
- Run smoke tests for startup, login, critical APIs, and data writes.
- Compare key logs/metrics before and after migration.
- Document known gaps and rollback plan before production rollout.
- Keep migration stage reports so later rollback or audit can trace each change set.
## 12) Common error triage
- `NoSuchMethodError` in HttpComponents:
- Verify `httpclient5` and `httpcore5` are compatible versions in dependency tree.
- `Failed to load ApplicationContext`:
- Check final `caused by` chain; common roots are `@Bean` signature issues, security config mismatch, and dependency conflicts.
- `BeanCreationException` around `RestTemplate`:
- Re-check HTTP client wiring and aligned dependency versions.