模型映射器异常:仅在 Docker 中无法将 java.lang.String 转换为 java.lang.Integer

Model Mapper Exception: failed to convert java.lang.String to java.lang.Integer only in Docker

我在将 DTO 转换为实体时遇到 NumberFormatException。尽管我得到该异常的字段在 DTO 和实体中都是字符串。

奇怪的是,只有当我在 docker 上部署我的应用程序时,如果我 运行 我的应用程序是独立的,我才会得到那个异常那么一切都很好

下面是我的代码

UserDTO:

@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserDto {
   private Integer userId;

   private String displayCode;

   private String firstName;

   private String lastName;

   private String username;

   private String password;

   private String email;

   private String phone;

   private String photo;

   private Short title;

   private String npi;

   private List<Integer> postNominal;

   @JsonProperty("isDoctor")
   private Boolean isDoctor;

   private Integer userType;

   private Boolean active;

   private Boolean agreementActive;

   private String accessCode;

   private Integer createdBy;

   private Timestamp createdTimestamp;

   private Integer updatedBy;

   private Timestamp updatedTimestamp;

   private List<RoleDto> roles;

   private Integer departmentId;

   private UserDto reportingTo;

   @JsonIgnore
   private String partnerDisplayCode;

   @JsonProperty("userRoles")
   private String userRole;

   private String  base64Image;

   getters...
   setters...

}

用户实体:

 @Entity
 @Table(name = "user", schema = "user_management")
 public class UserEntity extends BaseEntity implements Serializable {
     private static final long serialVersionUID = 1L;

     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "user_id")
     private Integer userId;

     @Column(name = "display_code")
     private String displayCode;

     @Column(name = "user_type")
     private Short userType;

     @Column(name = "first_name")
     private String firstName;

     @Column(name = "last_name")
     private String lastName;

     @Column(name = "username")
     private String username;

     @Column(name = "password")
     private String password;

     @Column(name = "email")
     private String email;

     @Column(name = "phone")
     private String phone;

     @Column(name = "photo")
     private String photo;

     @Column(name = "title")
     private Short title;

     @Column(name = "npi")
     private String npi;

     @Column(name = "department_id")
     private Integer departmentId;

     @Column(name = "is_doctor")
     private Short isDoctor;

     @Column(name = "agreement_active")
     private Short agreementActive;

     @Column(name = "access_code")
     private String accessCode;

     @Column(name = "status")
     private Short active;

     getters ....
     setters
 }

用户服务Class:

@Override
@Transactional
public UserDto persist(UserWithDependenciesDto user) {
    modelMapper.getConfiguration().setSkipNullEnabled(true);
    modelMapper.addConverter(CommonUtil.BOOLEAN_SHORT_CONVERTER);
    UserEntity userEntity = modelMapper.map(user.getUser(), UserEntity.class);
     ....
}

@PostConstruct
public void initializeModelMapperStrategy() {
    this.modelMapper.getConfiguration().setAmbiguityIgnored(true);
    this.modelMapper.getConfiguration()
                      .setMatchingStrategy(MatchingStrategies.STRICT);
}

UserWithDependenciesDto:

 public class UserWithDependenciesDto {
      @JsonProperty("partnerId")
      private Integer partnerId;
      @JsonProperty("user")
      private  UserDto user;
      @JsonProperty("createdBy")
      private  Integer createdBy;
     .... 
 }

异常:

org.modelmapper.MappingException: ModelMapper mapping errors:
nglis-usrm-api_1  | 
nglis-usrm-api_1  | 1) Converter org.modelmapper.internal.converter.NumberConverter@e822ec7 
failed to convert java.lang.String to java.lang.Integer.
nglis-usrm-api_1  | Caused by: org.modelmapper.MappingException: ModelMapper mapping errors:
nglis-usrm-api_1  | 
nglis-usrm-api_1  | 1) Error mapping AJ01 to java.lang.Integer
nglis-usrm-api_1  | 
nglis-usrm-api_1  | 1 error
nglis-usrm-api_1  |     at 
org.modelmapper.internal.Errors.toMappingException(Errors.java:258)
nglis-usrm-api_1  |     at 
org.modelmapper.internal.converter.NumberConverter.numberFor(NumberConverter.java:181)
nglis-usrm-api_1  |     at 
org.modelmapper.internal.converter.NumberConverter.convert(NumberConverter.java:75)
nglis-usrm-api_1  |     at 
org.modelmapper.internal.converter.NumberConverter.convert(NumberConverter.java:57)
nglis-usrm-api_1  |     at 
org.modelmapper.internal.MappingEngineImpl.convert(MappingEngineImpl.java:303)
nglis-usrm-api_1  |     at 
org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:110)
nglis-usrm-api_1  |     at 
org.modelmapper.internal.MappingEngineImpl.setDestinationValue(MappingEngineImpl.java:242)
nglis-usrm-api_1  |     at 
org.modelmapper.internal.MappingEngineImpl.propertyMap(MappingEngineImpl.java:188)
nglis-usrm-api_1  |     at 
org.modelmapper.internal.MappingEngineImpl.typeMap(MappingEngineImpl.java:152)
nglis-usrm-api_1  |     at 
org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:106)
nglis-usrm-api_1  |     at 
org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:72)
nglis-usrm-api_1  |     at org.modelmapper.ModelMapper.mapInternal(ModelMapper.java:573)
nglis-usrm-api_1  |     at org.modelmapper.ModelMapper.map(ModelMapper.java:406)
nglis-usrm-api_1  |     at 
com.sip.nglis.partneruser.manager.impl.UserManagerImpl.persist(UserManagerImpl.java:61)
nglis-usrm-api_1  |     at 
com.sip.nglis.partneruser.manager.impl.UserManagerImpl$$FastClassBySpringCGLIB$$c52d9382
.invoke( 
 <generated>)
nglis-usrm-api_1  |     at 
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
nglis-usrm-api_1  |     at 

Json:

{
"data":{
  "partnerId":1,
  "user":{
     "userId":0,
     "displayCode":"BC410",
     "firstName":"Ikram",
     "lastName":"Sardar Khan",
     "username":"dsfsdf342423",
     "password":"dsfsdfg",
     "email":"gdfgdf423423423@siparadigm.com",
     "phone":"03456789010",
     "title":2,
     "npi":"ghgrere4234qweas",
     "postNominal":[
        1,
        2
     ],
     "userType":1,
     "active":true,
     "agreementActive":true,
     "accessCode":"AJ01",    **This is the place where I'm getting the number format exception. **
     "createdBy":1,
     "createdTimestamp":1600780421007,
     "roles":[
        {
           "createdBy":1,
           "createdTimestamp":1600640026453,
           "roleUId":2,
           "roleUType":1,
           "name":"Partner Admin",
           "status":true,
           "isSystemOnly":0,
           "isClientRole":0,
           "isPhysician":false
        },
        {
           "createdBy":1,
           "createdTimestamp":1600640026453,
           "roleUId":3,
           "roleUType":1,
           "name":"CRM",
           "status":true,
           "isSystemOnly":0,
           "isClientRole":0,
           "isPhysician":true
        }
     ],
     "isDoctor":false
  },
  "createdBy":1

} }

我在 UserDto 和 Entity 的 AccessCode 上遇到数字格式异常。你会看到两边都是String.

好的,这非常有线。模型映射器以某种方式将其策略从严格更改为松散。尽管在 post 构造中,当它到达映射对象的位置时它是严格的,但策略是松散的。

所以我所做的是删除 post 构造注释并调用发生转换的方法。所以在转换的时候,策略变严格,上面的问题就解决了。