如何在Spring Boot Rest API中的BeanUtils.copyProperties中将String转换为枚举
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Spring Boot Rest API中的BeanUtils.copyProperties中将String转换为枚举相关的知识,希望对你有一定的参考价值。
我必须将属性从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)
//...
}
最快的解决方案,但我不喜欢它,因为它可能隐藏一些其他序列化/反序列化问题。
- 添加表示空虚的枚举值。您可以在DTO中定义枚举。
为了不将其存储在数据库中,应将此枚举值映射到
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);
以上是关于如何在Spring Boot Rest API中的BeanUtils.copyProperties中将String转换为枚举的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot Rest api 中创建安全登录控制器
如何将 Spring Security 与 Spring Boot Rest API 一起使用?
如何在 Spring Boot REST API 上设置超时?