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



将DTO转换为实体时,我面临NumberFormatException。尽管在DTO和Entity中,我得到异常的字段都是String。

奇怪的是,只有当我在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 

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

好吧,这很奇怪。不知怎的,模型映射器正在将其策略从"严格"更改为"宽松"。尽管在post-construct中,当它到达映射对象的位置时是Strict,但策略是Loose。

因此,我所做的是删除构造后的注释,并调用正在进行转换的方法。因此,在转换过程中,策略变得严格,上述问题得到了解决。

相关内容

最新更新