JAX RS 2.0无法转换UUID字段问题求助
通过Maven OpenAPI生成器插件基于OpenAPI YAML文件生成Java代码,部署至自带Jersey 2.22的WebLogic 12.2.1.4服务器后,整体功能正常,但UUID字段始终无法正确映射,始终为null。
相关代码与请求信息如下:
API类代码
@Path("/jobtest") public class JobTestAPI { @POST @Consumes({ "application/json" }) public Response jobTestNotification(@Valid @NotNull JobTestNotification jobTetNotification) { return Response.ok().entity("OK").build(); } }
数据类代码
@JsonTypeName ("JobTestNotification") public class JobTestNotification { private @Valid UUID jobId; private @Valid Date jobTimestamp; private @Valid String jobDescription; @JsonProperty("jobId") @NotNull public UUID getJobId() { return jobId; } @JsonProperty("jobId") public void setJobId(UUID jobId) { this.jobId = jobId; } // Other getters / setters with same annotations }
请求内容
{ "jobId": "abcdef12-abcd-ef12-1234-abcdef123456", "jobTimestamp": "2022-11-10T09:00:00.000Z", "jobDescription": "Some description" }
问题现象
- 请求返回错误,经ExceptionMapper排查,是UUID字段为null触发了@NotNull校验
- 移除API方法的@Valid注解后,其他字段值正常,但UUID仍为null
- 将jobId改为String类型可正常接收值,确认请求字段名称无误;尝试自定义UUID转换器也无效
核心原因
WebLogic 12.2.1.4自带的Jersey 2.22依赖的Jackson版本较低(通常为Jackson 2.6.x),早期Jackson版本对java.util.UUID的自动反序列化存在兼容性问题:
- 低版本Jackson默认不会自动将字符串格式的UUID转换为
UUID对象 - OpenAPI生成器生成的代码仅使用
@JsonProperty注解,未明确指定UUID的反序列化规则,导致低版本Jackson无法处理该字段
解决方案(无需改为String类型)
方案1:手动添加Jackson反序列化注解
在UUID字段的getter方法上添加@JsonDeserialize注解,明确指定使用UUID专属的反序列化器:
@JsonProperty("jobId") @NotNull @JsonDeserialize(using = UUIDDeserializer.class) public UUID getJobId() { return jobId; }
需确保项目引入了兼容版本的jackson-databind依赖(建议2.6.x系列,与Jersey 2.22匹配),UUIDDeserializer类位于com.fasterxml.jackson.databind.deser.std.UUIDDeserializer包下。
方案2:升级Jackson版本(需注意WebLogic兼容性)
若WebLogic允许替换内置Jackson版本,可在项目的weblogic.xml中配置优先加载项目自身的Jackson依赖:
<wls:container-descriptor> <wls:prefer-application-packages> <wls:package-name>com.fasterxml.jackson.*</wls:package-name> </wls:prefer-application-packages> </wls:container-descriptor>
随后在pom.xml中引入与Jersey 2.22兼容的高版本Jackson(如2.9.x):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.10.8</version> </dependency>
注意:升级前需充分测试兼容性,避免与WebLogic内置组件冲突。
方案3:修改OpenAPI YAML,自动生成带注解的代码
在OpenAPI YAML文件中,为UUID类型字段添加x-jackson-deserializer扩展配置,让生成器自动为字段添加反序列化注解:
components: schemas: JobTestNotification: type: object properties: jobId: type: string format: uuid x-jackson-deserializer: com.fasterxml.jackson.databind.deser.std.UUIDDeserializer # 其他字段配置
重新生成代码后,JobTestNotification类会自动包含@JsonDeserialize注解,无需手动修改代码。
内容的提问来源于stack exchange,提问作者Jameson_uk

