You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的自动反序列化存在兼容性问题:

  1. 低版本Jackson默认不会自动将字符串格式的UUID转换为UUID对象
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:55:13