当前位置: 首页 > 面试题库 >

JSR-303 @有效注释不适用于子对象列表

卢光誉
2023-03-14
问题内容

我的主要课程是

public class UserAddressesForm {

    @NotEmpty
    private String firstName;

    @NotEmpty
    private String lastName;

    private List<AddressForm> addresses;

...
setters and getters

public class AddressForm {

    @NotEmpty
    private String customName;
    @NotEmpty
    private String city;
    @NotEmpty
    private String streetAn;
    @NotEmpty
    private String streetHn;
    @NotEmpty
    private String addressCountry;
    @NotEmpty
    private String postCode;
...
setters and getters

控制器

@RequestMapping(value = "/up", method = RequestMethod.POST)
    public String completeForm(@Valid @ModelAttribute("userAddressesForm") UserAddressesForm userAddressesForm,  
            BindingResult result, HttpServletRequest req)
...

JSP页面

<form:form commandName="userAddressesForm" action="registered">
    <table>

        <tr>
            <td class="formLabels"><form:label path="firstName">
                <spring:message code="label.name" />
            </form:label></td>
            <td><form:input path="firstName" /></td>
            <td><form:errors path="firstName" cssClass="error" /></td>
        </tr>
        <tr>
            <td class="formLabels"><form:label path="lastName">
                <spring:message code="label.surname" />
            </form:label></td>
            <td><form:input path="lastName" /></td>
            <td><form:errors path="lastName" cssClass="error" /></td>
        </tr>
    </table>

    <c:forEach items="${userAddressesForm.addresses}" varStatus="gridRow">  
        <div id="main_address" class="address_data_form">
            <fieldset>
                <legend><spring:message code="label.stepThreeMainAddressInfo" /></legend>
                <a href="#" class="deleteItem"></a>
                <table>
                    <tr>            
                        <td class="formLabels">
                            <spring:message code="label.address.custom.name" />
                        </td>
                        <td>
                            <spring:bind path="addresses[${gridRow.index}].customName">
                                <input type="input" name="<c:out value="${status.expression}"/>"
                                    id="<c:out value="${status.expression}"/>"
                                    value="<c:out value="${status.value}"/>" />
                                    <form:errors path="${status.expression}"/>
                            </spring:bind>
                        </td>   
                    </tr>               
                    <tr>            
                        <td class="formLabels">
                            <spring:message code="label.streetAnStreetHn" />
                        </td>
                        <td>
                            <spring:bind path="addresses[${gridRow.index}].streetAn">
                                <input type="input" name="<c:out value="${status.expression}"/>"
                                    id="<c:out value="${status.expression}"/>"
                                    value="<c:out value="${status.value}"/>" />
                            </spring:bind>
                            <spring:bind path="addresses[${gridRow.index}].streetHn">
                            <input type="input" name="<c:out value="${status.expression}"/>"
                                id="<c:out value="${status.expression}"/>"
                                value="<c:out value="${status.value}"/>" >
                            <form:errors path="addresses[${gridRow.index}].streetHn"/>
                            </spring:bind>

                        </td>
                    </tr>
                    <tr>                        
                        <td class="formLabels">
                            <spring:message code="label.postCode" />
                        </td>
                        <td>
                            <spring:bind path="addresses[${gridRow.index}].postCode">
                                <input type="input" name="<c:out value="${status.expression}"/>"
                                    id="<c:out value="${status.expression}"/>"
                                    value="<c:out value="${status.value}"/>" />
                            </spring:bind>
                        </td>                   
                    </tr>
                    <tr>                
                        <td class="formLabels">
                            <spring:message code="label.city" />
                        </td>
                        <td>
                            <spring:bind path="addresses[${gridRow.index}].city">
                                <input type="input" name="<c:out value="${status.expression}"/>"
                                    id="<c:out value="${status.expression}"/>"
                                    value="<c:out value="${status.value}"/>" />
                                <form:errors path="addresses[${gridRow.index}].city" cssClass="error" />
                            </spring:bind>
                        </td>
                    </tr>       
                </table>    
            </fieldset>
        </div>
    </c:forEach>

为什么对象字段未通过AddressForm验证?

请帮忙。


问题答案:

您需要用注解装饰的addresses成员。请参阅《JSR
303:Bean验证》的

3.1.3和3.5.1节。正如我在对问题“ 是否存在使用注释方法启用JSR 303
Bean验证的标准方法”的
回答中所解释的那样,这是根据JSR 303
真正使用注释的方式。UserAddressesForm``@Valid@Valid

编辑 示例代码:Hibernate Validator-Object
Graph。(汽车乘客名单)

*从 Hibernate Validator
6参考文档中
*编辑

在6之前的版本中,Hibernate Validator支持对一部分容器元素的级联验证,并且它是在容器级别实现的(例如,您将用于@Valid private List<Person>启用的级联验证Person)。

仍然支持,但不建议这样做。请改用容器元素级别的@Valid注释,因为它更具表现力。

例:

public class Car {

        private List<@NotNull @Valid Person> passengers = new ArrayList<Person>();

        private Map<@Valid Part, List<@Valid Manufacturer>> partManufacturers = new HashMap<>();

       //...
   }

另请参阅Bean验证2.0 / Jakarta
Bean验证中的新增功能。



 类似资料:
  • 使用JSR-303注释在上下文启动时验证Springbean是否有一种简单的方法?我继承了一些将配置表示为JSR-303注释POJO的类。这些都是在对象层次结构中传递的,所以我一直在使用它们。 我可以想象定义bean来设置这样一个类的属性,然后在上下文启动时运行JSR-303验证器,以确保正确设置所有值。 请注意,我不是在问SpringMVC中绑定表单提交的验证问题。

  • 问题内容: 是否有可能在JSR 303-Jave Bean Validation中验证对象的集合,而该集合本身没有任何注释,但包含在其中的元素呢? 例如,由于第二个人的名字为空,这是否可能导致约束冲突: 问题答案: 是的,只需添加到集合中即可。 这是《 Hibernate验证程序参考》中的示例。 这是标准的JSR-303行为。参见规范的 3.1.3节。

  • 我们正在开发REST服务,并希望使用JSR303进行输入数据验证,但这里的问题是所有模型对象都是从groovy DSL生成的,并将作为jars导入。因此,在对象字段之上编写JSR-303注释没有灵活性。 那么,有没有其他方法可以不用注释使用JSR-303,可以通过XML配置吗?或者在这种情况下,请提供任何验证建议。 谢啦

  • 这是我的控制器。它接受带有两个字段的请求,和。字段是,字段是。这两个变量都用注释,因此,我希望Spring调用每个相应字段的类。但是,这只发生在,而不是。 My被触发,但My未被触发。这两个类都实现了Spring接口<代码>MyObjectValidator。支持(类) 这里可能有什么问题?我读过类似的问题,常见的错误是在注释中没有使用适当的参数,或者将方法设置为,而不是,但这两者都不适用于我的情

  • 问题内容: 我有如下测试: 具有以下输出: 但是,我希望注释可以被覆盖,并且不会出现警告。 有没有办法做到这一点? 编辑:我发现一个错误似乎与此有关,但我最终运行4.2.0,仍然得到上述行为。 问题答案: 实际上,JSR-303不支持覆盖验证注释。相反,子类中重写方法的注释将 累积 应用:从规范的3.3节开始:

  • 问题内容: 我刚刚开始测试JSR-303 Bean验证,并且想知道是否有可能。我们的应用程序中有一个用于所有String字段的默认正则表达式。如果我想使用bean验证来应用此功能,我想我需要在表单对象中注释每个字段。 一击是否可以将@Pattern应用于所有字符串(或某些字段)?我们正在WebLogic 10.3.4上使用Hibernate实现,并以JSF2.0为前端。验证应该独立于视图,因为我可