如何解决模型映射器异常:仅在Docker中无法将java.lang.String转换为java.lang.Integer
将DTO转换为实体时,我面临NumberFormatException。尽管我在DTO和Entity中遇到异常的字段都是String。
奇怪的是,仅当我在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...
}
UserEntity:
@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
}
UserService类:
@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,"roleUId":3,"name":"CRM","isPhysician":true
}
],"isDoctor":false
},"createdBy":1
} }
我在UserDto和Entity中的AccessCode上遇到数字格式异常。您将在两边都看到它是String。
解决方法
好的,这是非常有线的。模型映射器以某种方式将其策略从“严格”更改为“宽松”。尽管在后期构造中,到达目标对象的绘制位置时严格,但策略是宽松的。
所以我要做的是删除后构造注释,并在发生转换的地方调用该方法。因此在转换过程中,该策略变得严格,上述问题得以解决。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。