【问题标题】:Java complex validation in Dropwizard?Dropwizard中的Java复杂验证?
【发布时间】:2012-12-14 16:52:41
【问题描述】:

我想在 REST 端点上接受 JSON 并将其转换为正确的类型以便立即验证。

端点如下所示:

@POST
public Response createCar(@Valid Car car) { 
    // persist to DB
    // ... 
}

但是 Car 有很多子类,例如Van、SelfDrivingCar、RaceCar 等。我如何在端点上接受不同的 JSON 表示,同时保留验证代码 在 Resource 中像 @Valid Car car?

这样简洁

再次:我发送 JSON 格式(这里是 Car 的子类,即 SelfDrivingCar):

{ 
    "id" : "t1",                      // every Car has an Id
    "kind" : "selfdriving",           // every Car has a type-hint
    "max_speed" : "200 mph",          // some attribute
    "ai_provider" : "fastcarsai ltd." // this is SelfDrivingCar-specific
}

我希望验证机制查看kind 属性,在此处创建适当子类的实例,例如SelfDrivingCar 并执行验证。

我知道我可以为所有类型的汽车创建不同的端点,但这似乎并不干燥。而且我知道我可以使用真正的Validator 代替注释并手动完成,所以我只是问是否有一些优雅的捷径可以解决这个问题。

【问题讨论】:

    标签: java json validation jax-rs dropwizard


    【解决方案1】:

    您的验证框架不负责提取正确的多态类型并对其进行验证。事实上,在验证开始时,对象已经创建。它只能使用它当时拥有的东西。但请注意:

    public Response createCar(@Valid Car car) {
        // ...
    }
    

    将在“汽车”的实际运行时类型上调用验证。所以很明显,您想要做的是确保 car 变量在运行时绑定到正确的类型。这是您的反序列化框架的责任。您需要确定使用应用程序中使用的 JSON 库的正确方法,但对于 Jackson,您将使用 @JsonTypeInfo 注释来确定多态类型的范围。

    @JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
    public class Car implements Serializable {
    }
    

    【讨论】:

    【解决方案2】:

    使用 DW 0.7.1

    在我的情况下,我有一个自定义用户类,我在那里添加:

    @ValidationMethod(message="user_name is null or empty")
    public boolean isUserName() {       
        if (Strings.isNullOrEmpty(user_name)) {
            return false;
        } else {
            return true;
        }
    }
    

    现在使用了@Valid,我在测试中得到了 javax.validation.ConstraintViolationException --> @Test(expected=javax.validation.ConstraintViolationException.class)

    【讨论】:

    • 我不喜欢@ValidationMethod 的一点是,即使我将验证逻辑放在不同的类中,我仍然必须使用标记为@ValidationMethod 的方法污染正在验证的类。当然,可以将@Validated 与不同的验证组一起使用,但正在验证的类中仍然存在污染。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多