Java Spring控制器:对象=';的验证失败;发票数据';。错误计数:4

Java Spring控制器:对象=';的验证失败;发票数据';。错误计数:4,java,spring,spring-boot,validation,thymeleaf,Java,Spring,Spring Boot,Validation,Thymeleaf,我有两个对象,Contractor,带有一个字段ContractorData,而ContractorData有一个类型为Invoice的对象列表: Contractor id email ContractorData ContractorData id FistName LastName ... List<InvoiceData> 这里一切都很好 但是,我有一个控制器,它指向一个页面,在该页面上可以添加一个Invoi

我有两个对象,
Contractor
,带有一个字段
ContractorData
,而
ContractorData
有一个类型为
Invoice
的对象列表:

Contractor
    id
    email
    ContractorData

ContractorData
    id
    FistName
    LastName
    ...
    List<InvoiceData>
这里一切都很好

但是,我有一个控制器,它指向一个页面,在该页面上可以添加一个
InvoiceData

@RequestMapping(value = "/add/{id}")
public String addPage(@PathVariable("id") String id, Model model) {
    InvoiceData invoiceData = new InvoiceData();
    model.addAttribute("contractorid", id);
    model.addAttribute("invoicedata", invoiceData);
    return "add";
}
以及用于添加发票的控制器:

 @RequestMapping(value = "/addinvoice/{id}", method = RequestMethod.POST, produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public String addInvoice(@PathVariable("id") String id, InvoiceData data, Model model) {
        Contractor contractor = contractorRepository.findById(id).get();
        contractor.getInvoices().add(data);
        contractorRepository.save(contractor);
        model.addAttribute("contractor", contractor);
        return "index";
    }
在HTML表单端,index.HTML的表单如下所示:

 <form action="#" th:action="@{/contractor/update/{id}(id=${contractor.id})}" th:object="${contractor}" method="post">
            <ul class="form-style-1">
                <li>
                    <label>First Name<span class="required">*</span></label>
                    <input type="text" th:field="*{contractorData.firstName}" id="firstName" th:value="${contractor.contractorData?.firstName}">
                </li>
                <li>
                    <label>Last Name<span class="required">*</span></label>
                    <input type="text" th:field="*{contractorData.lastName}" id="lastName" th:value="${contractor.contractorData?.lastName}">
                </li>
                ... and more
                <li>
                    <input type="submit" value="Submit" />
                </li>
    </ul>
</form>
问题在于保存
InvoiceData
。当我填写表格并单击提交时,我收到一个错误:

Field error in object 'invoiceData' on field 'contractDate': rejected value [2019-04-11]; codes [typeMismatch.invoiceData.contractDate,typeMismatch.contractDate,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [invoiceData.contractDate,contractDate]; arguments []; default message [contractDate]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'contractDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2019-04-11'; nested exception is java.lang.IllegalArgumentException]
出现意外错误(类型=错误请求,状态=400)。 对象=“invoiceData”的验证失败。错误计数:4

重要编辑

在控制台输出上,我还得到一个错误:

Field error in object 'invoiceData' on field 'contractDate': rejected value [2019-04-11]; codes [typeMismatch.invoiceData.contractDate,typeMismatch.contractDate,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [invoiceData.contractDate,contractDate]; arguments []; default message [contractDate]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'contractDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2019-04-11'; nested exception is java.lang.IllegalArgumentException]

但是正如我之前所说的,一切都可以通过
ContractorData
updateform…

这里的问题是java.date。 因为在html中,日期的格式为“yyyy-MM-dd”。您将得到错误,因为 spring无法将此日期转换为java.date

你可能会这样宣布接受日期

Date receptionDate;
现在,换成

    @DateTimeFormat(pattern = "yyyy-MM-dd")
     Date receptionDate;
Date receptionDate;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
     Date receptionDate;