java - 模型映射器异常:仅在 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 上遇到数字格式异常。你会看到两边都是字符串。
解决方案
好的,这是非常有线的。不知何故,模型映射器正在将其策略从严格更改为宽松。尽管在后期构造中,当它到达映射对象的位置时它是严格的,但策略是松散的。
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.
推荐阅读
- javascript - 使用 jQuery 平滑滚动导航会导致奇怪的行为
- php - PHP 和 Jquery 即时搜索 SQLite 查询
- php - PHP:使用太多嵌套循环,寻找更高效的解决方案
- phpmyadmin - phpMyAdmin 无法识别主键
- sublimetext3 - 复杂的按键序列
- javascript - 如何使用jquery添加一个类来锚定父级的第一个单词?
- swift - appleTV:URLSession.shared.dataTask 下载为空
- node.js - 反应新项目对 ^6.14.0 的依赖 || ^8.10.0 || >=9.10.0
- css - Styled-components 多个伪元素
- php - 有关涉及语法的面向对象 PHP 的问题