java - 为什么我的内部对象的自定义 validator 不用于验证?

标签 java spring spring-boot validation thymeleaf

我有一个自定义 validator ,如下所示:

@Component
public class PersonFormValidator implements Validator {

    Logger logger = LoggerFactory.getLogger(com.myapp.generator.component.impl.PersonFormValidator.class);

    @Override
    public boolean supports(Class<?> clazz) {
        return Contractor.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        Contractor contractor = (Contractor) target;
        if (contractor.getContractorData().getNip() == null || contractor.getContractorData().getNip().equals("")) {
            errors.rejectValue("contractorData.nip", "empty");
        }
        logger.error(errors.toString());
    }
}

在 Thymeleaf 模板方面,它看起来像这样:

<form action="#" th:action="@{/contractor/update/{id}(id=${contractor.id})}" th:object="${contractor}" method="post">
        <ul class="form-style-1">
<li>
     <label>NIP<span class="required">*</span></label>
     <input type="text" th:field="*{contractorData.nip}" id="nip" th:value="${contractor.contractorData?.nip}" >
     <span class="error" th:if="${#fields.hasErrors('contractorData.nip')}" th:errors="*{contractorData.nip}">Generic error</span>
</li>

我的 Controller 如下所示:

@RequestMapping(value = "/contractor/update/{id}", method = RequestMethod.POST, produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String updateContractor(@PathVariable("id") String id, @Validated @ModelAttribute("contractor") Contractor contractor, Model model, BindingResult result) {
if (result.hasErrors()) {
    logger.error("BINDING RESULT ERROR");
    return "index";
} else {
    Contractor contractorPO = contractorRepository.findById(id).get();
    ContractorData contractorData = 
    //not important code here
    contractorPO.setContractorData(contractorData);
    contractorRepository.save(contractorPO);
    model.addAttribute("contractor", contractorPO);
    return "index";
}

当然我已经注册了 validator :

@InitBinder({"invoicedata", "contractor"})
protected void initPersonFormBinder(WebDataBinder binder) {
    binder.addValidators(invoiceFormValidator, personFormValidator);
}

当我启动应用程序并转到应用程序地址时,出现如下错误:

Invalid target for Validator [com.myapp.generator.component.impl.InvoiceFormValidator@e52be6c]: Contractor(id=5cc193e581c7dc75cfb7bcff, email=some@mail.com, contractorData=ContractorData(firstName=Name, lastName=Lastname, businessName=Apple, businessLocation=Warsaw, nip=, regon=adgadgdagdag), invoices=[])

没有任何方法对我有用,从昨天开始我就一直在与这个问题作斗争......

我可以在代码中更改哪些内容才能使验证有效?

最佳答案

我的猜测是两个 validator 都应用于两种形式:

  • 对于发票数据;应用invoiceFormValidator和personFormValidator
  • 对于承包商;应用invoiceFormValidator和personFormValidator

如果您在两个单独的方法中绑定(bind) validator 会怎样?

@InitBinder("invoicedata")
protected void invoiceDataBinder(WebDataBinder binder) {
    binder.setValidator(invoiceFormValidator);
}

@InitBinder("contractor")
protected void contractorDataBinder(WebDataBinder binder) {
    binder.setValidator(personFormValidator);
}

关于java - 为什么我的内部对象的自定义 validator 不用于验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55849537/

相关文章:

java - Arrays.asList 如何返回实例化列表?

java - 如何配置 Tika 的 pom.xml 以停止获取所有许可证依赖性警告?

java - 从 Spring boot 加载多个 Angular 项目

java - 如何避免在多个地方对同一事物进行可能很长的 if 语句

spring - 如何使用外部路径作为命令行参数或配置文件夹在 Spring Boot 2.1.7 中读取外部 xml

java - 使用runjettyrun插件时如何查看JSP java文件

java - io.realm.exceptions.RealmException : ContactsModel is not part of the schema for this Realm 异常

spring - 在spring配置文件中设置资源

java - 如何使用PaymentIntent(Stripe)授权资金?

java - 如何在 Spring Integration 的入站网关中接受 MultipartFile