Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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
Json 关于Spring MVC验证表单中@Valid注释的一些疑问_Json_Spring_Validation_Spring Mvc_Bean Validation - Fatal编程技术网

Json 关于Spring MVC验证表单中@Valid注释的一些疑问

Json 关于Spring MVC验证表单中@Valid注释的一些疑问,json,spring,validation,spring-mvc,bean-validation,Json,Spring,Validation,Spring Mvc,Bean Validation,我有以下情况,我认为我有以下形式: <form id="readJson" class="readJsonForm" action="<c:url value="/messageconverters/json" />" method="post"> <input id="readJsonSubmit" type="submit" value="Read JSON" /> </form> 因此,这个Jquery函数创建了一个新的JSO

我有以下情况,我认为我有以下形式:

<form id="readJson" class="readJsonForm" action="<c:url value="/messageconverters/json" />" method="post">
    <input id="readJsonSubmit" type="submit" value="Read JSON" />   
</form>
因此,这个Jquery函数创建了一个新的JSON对象,该对象的两个属性(foo和fruit)以这种方式进行了值化:

foo=bar

水果=苹果

HTTP请求由我的控制器类的以下方法处理:

/* Metodo che gestisce HTTP Request di tipo POST dirette verso
 * l'URL: "/messageconverters/json"
 * @param L'oggetto JSON inserito all'interno del campo body dell'HTTP
 *        su cui viene eseguita una validazione
 *        
 */
@RequestMapping(value="/json", method=RequestMethod.POST)
public @ResponseBody String readJson(@Valid @RequestBody JavaBean bean) {
    return "Read from JSON: " + bean;
}
此方法只需从HTTP请求的body字段获取JSON对象,并使用Jaxb2RootElementHttpMessageConverter将其传输到新的JavaBean对象中

在我的例子中,JavaBean对象是一个只有两个属性的对象:foofruit以及getter、setter和toString()方法,类似这样:

@XmlRootElement 公共类JavaBean{

@NotNull
private String foo;

@NotNull
private String fruit;

public JavaBean() {
}

public JavaBean(String foo, String fruit) {
    this.foo = foo;
    this.fruit = fruit;
}
    // GETTER, SETTER & toString() methods
好的,JSON对象中的值放在具有相同名称的JavaBean对象变量中……这对我来说非常清楚

我对@Valid注释的规则有一些问题

我的JavaBean参数是使用@Valid注释注释的,阅读文档后我知道这不是Spring注释,但与验证框架JSR-303验证API相关

我对这个API知之甚少,我记得@Valid触发了对对象字段的验证

但我记得我的对象字段(JavaBeans对象中的变量)必须使用一些验证注释进行注释,例如@NotNull或使用实现我的个人验证器的个人验证Java类

在这种情况下,我对此一无所知,我的方法参数上只有@Valid注释

在这种情况下,你到底要做什么

我唯一能想到的是,检查我的JSON对象是否正确映射到JavaBean对象(如果具有相同的值化属性),例如,如果JSON对象只有一个值化属性,则会出错

有人能帮我吗

Tnx
Andrea

首先:如果要发送Json,则需要将consumes=“application/Json”添加到@requestmapping注释中,如果要发送Json响应库,则需要为products添加consumes=“application/Json”

第二:@Valid用于调用验证api,以检查命令对象在映射过程中的所有约束。因此,您需要在类路径中有一个类似hibernate validator的实现。我不确定如果在运行时没有它会发生什么。可能只是忽略了它

要获取控制器中的所有验证错误,请添加BindingResult类型的参数。此类包含所有验证错误。 没有任何东西阻止控制器处理您的对象。您负责对bindingresult调用“hasError”,并采取相应的行动


第三:因为您提到了foo和bar以及JavaBean,所以看起来您正在使用showcase应用程序。这个示例通常编写得很好,并且经过了很好的解释。请尝试按原样部署应用程序并直接进行操作。通过这个示例,我了解了spring mvc的大部分内容。

非常感谢,是的,我正在学习showcase示例!!!我出错是因为我的JavaBean类的字段用@NotNull validation annotation注释了,这就是原因,因为这个示例运行良好(字段不为null,因此这是正确验证的)。您对我说的唯一疑问是添加consumes=“application/json”在我的RequestMapping注释中,我知道consumes和product的用法,但在我发布的代码中没有……这可能取决于此,因为此示例取自Converter部分,展示了Spring如何使用Converter转换不同数据流(如JSON对象或XML对象)中的日期流(如文本)?
@NotNull
private String foo;

@NotNull
private String fruit;

public JavaBean() {
}

public JavaBean(String foo, String fruit) {
    this.foo = foo;
    this.fruit = fruit;
}
    // GETTER, SETTER & toString() methods