如何在Spring Boot Rest API中的BeanUtils.copyProperties中将String转换为枚举

问题描述 投票:0回答:2

我必须将属性从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转换为枚举?

java rest spring-boot enums dto
2个回答
1
投票

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; } }

它应该工作,但我不是一个大粉丝......


0
投票

枚举不能是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); 
© www.soinside.com 2019 - 2024. All rights reserved.