我必须将属性从dto复制到实体类。我正在使用BeanUtils.copyProperties()。
在请求正文中,我发送如下:
{
"userName":"test",
"userStatus": "I",
}
DTO课程:
public class UserDto {
private String userName;
private String userStatus;
public User buildUser() {
User user = new User();
BeanUtils.copyProperties(this, user);
return user;
}
}
实体类:
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long userId;
@Column(name = "user_name")
private String userName;
@Enumerated(EnumType.STRING)
@Column(name = "user_status")
private UserStatus userStatus;
}
注意:userStatus可以在表中为可空字段。
服务代码:
User user = userDto.buildUser();
我在User实体类中将userStatus值设置为null。
当我将UserDto.userStatus更改为枚举类型时,请求正文不接受空值。
在BeanUtils.copyProperties()中如何从String转换为枚举?
Spring BeanUtils
不是为这种自定义而设计的。
您应该手动设置字段。
而MapStruct或Dozen则是。
作为保持BeanUtils
的替代方法,您没有明确的setter调用:
@JsonCreator
的静态方法,例如:@JsonCreator public static UserStatus getValue(String name) {
return
Stream.of(UserStatus.values())
.findAny(s -> s.name().equals(name))
.orElse(null);
}
在大多数情况下,这是最好的解决方案,因为它在根处处理问题。
public class UserDto {
@JsonIgnoreProperties(ignoreUnknown = true)
//...
}
最快的解决方案,但我不喜欢它,因为它可能隐藏一些其他序列化/反序列化问题。
null
,并在实体本身中完成。
例如 :public void setUserStatus(UserStatus userStatus){
if (userStatus != UserStatus.EMPTY){
this.userStatus = userStatus;
}
}
它应该工作,但我不是一个大粉丝......
枚举不能是null
,因为它们的下划线值是int
,但您可以将enum
中的FIRST值设置为默认值。 tyou还可以将DTO中的字段定义为Enum类型而不是String。
UserStatus
public enum UserStatus {
NULL,
ACTIVE,
INACTIVE;
}
服务代码:
userDto.setUserStatus(UserStatus.NULL);
userDto.buildUser();
或者如果要在转换时将copyProperties
方法的此覆盖设置为忽略userStatus
字段:
public static void copyProperties(Object source, Object target,
@Nullable Class<?> editable,
@Nullable String... ignoreProperties);