如何在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 上设置超时?

Spring Boot REST Api中的一对多关系

如何在 Spring-Boot 项目中为电话号码身份验证创建 REST API?

Spring Boot JWT - 如何实现刷新令牌和注销 REST-API