java—如何验证或限制枚举类型以仅接受特定值

n3ipq98p  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(470)

在springboot&hibernate中,我制作了一个api来更改产品的订单状态,在orderstatus类中,我有两个枚举类型字段,fromstatus和tostatus
我的orderstatus类如下所示:

@Entity
public class OrderStatus {

@Id
private Long orderProductId;

@Enumerated(value = EnumType.STRING)
private Status fromStatus;

@Enumerated(value = EnumType.STRING)
private Status toStatus;

枚举:

public enum Status{
ORDER_PLACED, CANCELLED, ORDER_CONFIRMED, ORDER_REJECTED, REFUND_INITIATED, ORDER_SHIPPED, DELIVERED, CLOSED,
RETURN_REQUESTED, RETURN_REJECTED, RETURN_APPROVED, PICK_UP_INITIATED, PICK_UP_COMPLETED, REFUND_COMPLETED

}
我想限制的是,当fromstatus处于order\u placed状态时,tostatus只能是order\u confirmed、order\u rejected或cancelled。
可能值的Map图
目前我没有任何验证,所以当有人使用changeorderstatus api时,他们可以将这两个字段更改为他们想要的任何内容,
例如:from\ u status:order\ u placed和to\ u status:return\ u initiated,我不希望发生这种情况。
allowed tostatus值应取决于fromstatus中的值
我可以做一个这样的方法,在这里我用if条件检查每个可能的值,我想知道是否有更聪明的方法来解决这个问题。
谢谢您

erhoui1w

erhoui1w1#

一个简单的方法是包含一个 validate(Status status) 在你的枚举中
比如:

enum Status {
    ORDER_PLACED {
        @Override
        public boolean validate(Status status) {
            return status== CANCELLED || status== ORDER_CONFIRMED || status== ORDER_REJECTED;
        }
    },
    CANCELLED{
        @Override
        public boolean validate(Status status) {
            return ...;
        }
    },
    ORDER_CONFIRMED {
        ...
    }, ...

    public abstract boolean validate(Status status)
}

更好的方法(但更复杂)是使用 StateMachine 像Spring式机器

31moq8wy

31moq8wy2#

如果你需要确定没有人能拯救 OrderStatus 如果枚举值错误,则必须在此基础上构建一些业务逻辑。
我建议搬家 fromStatus 以及 toStatus 并在此类中实现验证。

@Entity
public class OrderStatus {
  @Id
  private Long orderProductId;

  @Embedded
  private ComplexStatus status;
}
@Embeddable
class ComplexStatus {
  @Enumerated(value = EnumType.STRING)
  private Status fromStatus;

  @Enumerated(value = EnumType.STRING)
  private Status toStatus;

  // getters, setters, constructors
}

相关问题