Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dropwizard中的Java复杂验证?_Java_Json_Validation_Jax Rs_Dropwizard - Fatal编程技术网

Dropwizard中的Java复杂验证?

Dropwizard中的Java复杂验证?,java,json,validation,jax-rs,dropwizard,Java,Json,Validation,Jax Rs,Dropwizard,我希望在REST端点上接受JSON,并将其转换为正确的类型以立即进行验证 端点如下所示: @POST public Response createCar(@Valid Car car) { // persist to DB // ... } 但是Car有很多子类,例如Van、SelfDrivingCar、RaceCar等。我如何在端点上接受不同的JSON表示,同时保留验证代码 在资源中,像@Valid Car-Car一样简洁 再次:我发送类似JSON的内容(这里是Car子类

我希望在REST端点上接受JSON,并将其转换为正确的类型以立即进行验证

端点如下所示:

@POST
public Response createCar(@Valid Car car) { 
    // persist to DB
    // ... 
}
但是Car有很多子类,例如Van、SelfDrivingCar、RaceCar等。我如何在端点上接受不同的JSON表示,同时保留验证代码 在资源中,像
@Valid Car-Car
一样简洁

再次:我发送类似JSON的内容(这里是Car子类的表示,即SelfDrivingCar):

我希望验证机制查看
kind
属性,创建相应子类的实例,例如
SelfDrivingCar
,并执行验证


我知道我可以为所有类型的汽车创建不同的端点,但这似乎并不干燥。我知道我可以使用一个真正的
验证器
而不是注释,然后手工完成,所以我只是想问一下,对于这个问题是否有一些优雅的捷径。

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

public Response createCar(@Valid Car car) {
    // ...
}
将对“car”的实际运行时类型调用验证。很明显,您要做的是确保
car
变量在运行时绑定到正确的类型。这是反序列化框架的责任。在应用程序中使用JSON库时,您需要确定执行此操作的正确方法,但在Jackson中,您将使用@JsonTypeInfo注释来确定多态类型的范围

@JsonTypeInfo(use=Id.NAME, include=As.PROPERTY, property="kind")
public class Car implements Serializable {
}
使用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(预期=javax.validation.ConstraintViolationException.class)

谢谢你让我走上正轨,找到了一些文章,太:我不喜欢这两个
@ValidationMethod
的地方是,即使我将验证逻辑放在不同的类中,我也必须用标记为
@ValidationMethod
的方法污染正在验证的类。当然,可以将
@Validated
与不同的验证组一起使用,但在被验证的类中仍然存在污染。
@ValidationMethod(message="user_name is null or empty")
public boolean isUserName() {       
    if (Strings.isNullOrEmpty(user_name)) {
        return false;
    } else {
        return true;
    }
}