首页 > 解决方案 > 模型映射器异常:仅在 Docker 中无法将 java.lang.String 转换为 java.lang.Integer

问题描述

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

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

下面是我的代码

用户DTO:

@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
 }

用户服务类:

@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 

杰森:

{
"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 上遇到数字格式异常。你会看到两边都是字符串。

标签: javaspring-bootdockermodelmapper

解决方案


好的,这是非常有线的。不知何故,模型映射器正在将其策略从严格更改为宽松。尽管在后期构造中,当它到达映射对象的位置时它是严格的,但策略是松散的。

So what I did was to remove the post construct annotation and call the method where conversions are happening. So during conversion, the strategy became strict and the above issue was resolved.


推荐阅读