Java POST上的Spring Rest Json映射(无效属性)

Java POST上的Spring Rest Json映射(无效属性),java,json,spring,hibernate,Java,Json,Spring,Hibernate,这对我来说是个奇怪的问题。我以前做过实体、控制器和表单验证,但我对这个错误感到困惑 那么背景故事。这是带Hibernate的spring boot,连接到PostgreSQL数据库。我试图做的是将POST请求映射到创建资源。我正试图用纯JSON实现这一点。我以前也能做到这一点 有问题的错误是 bean类[com.example.api.entities.forms.OrganizationRegistrationForm]的无效属性“Test”:bean属性“Test”不可读或具有无效的gett

这对我来说是个奇怪的问题。我以前做过实体、控制器和表单验证,但我对这个错误感到困惑

那么背景故事。这是带Hibernate的spring boot,连接到PostgreSQL数据库。我试图做的是将POST请求映射到创建资源。我正试图用纯JSON实现这一点。我以前也能做到这一点

有问题的错误是

bean类[com.example.api.entities.forms.OrganizationRegistrationForm]的无效属性“Test”:bean属性“Test”不可读或具有无效的getter方法:getter的返回类型是否与setter的参数类型匹配

请求主体,如邮递员中所示是

{
   "organizationName":"Test",
   "employees":10
}
它抱怨的组织注册表单

public class OrganizationRegistrationForm {
    @NotEmpty
    private String organizationName = "";

    @NotNull
    private int employees;

    private JsonNode contactInfo;
    private JsonNode locationInfo;


    public String getOrganizationName() {
        return organizationName;
    }
    public void setOrganizationName(String name) {
        this.organizationName = name;
    }
    public int getEmployees() {
        return employees;
    }
    public void setEmployees(int employees) {
        this.employees = employees;
    }
    public JsonNode getContactInfo() {
        return contactInfo;
    }
    public void setContactInfo(JsonNode contactInfo) {
        this.contactInfo = contactInfo;
    }
    public JsonNode getLocationInfo() {
        return locationInfo;
    }
    public void setLocationInfo(JsonNode locationInfo) {
        this.locationInfo = locationInfo;
    }


}
如果您需要,请求方法

@RequestMapping(value="/organization", method = RequestMethod.POST)
    public Organization registerOrganization(@Valid @RequestBody OrganizationRegistrationForm form,
            BindingResult bindingResult) throws Exception {
        if(bindingResult.hasErrors()) {
            LOGGER.error("The registration form entered has errors: {}", bindingResult.getAllErrors().toString());
            throw new InvalidForm();
        }

        try {
            Organization org = orgService.registerOrganization(form);
            if(org!=null)
                return org;
        } catch(DataIntegrityViolationException e) {
            bindingResult.reject("name.exists", "The supplied name is already in use");
        }

        throw new InvalidForm();
    }
 ValidationUtils.rejectIfEmptyOrWhitespace(errors, target.getOrganizationName(), "name.empty", "Please enter a name");
虽然我猜它甚至没有走那么远。OrganizationName字段最初被称为“name”,但我对其进行了更改,以确定这是否是问题所在

对我来说更奇怪的是,当我使用这个JSON对象时,它工作了。但是创建了一个名为“organizationName”的组织


有一次它甚至抱怨无效的属性是“”。如在空的。我做错了什么?

我不知道怎么做,也不知道为什么。但出于某种原因,答案似乎出现在活页夹使用的OrganizationRegistrationFormValidator类中

问题的关键在于验证(对象目标、错误)方法

@RequestMapping(value="/organization", method = RequestMethod.POST)
    public Organization registerOrganization(@Valid @RequestBody OrganizationRegistrationForm form,
            BindingResult bindingResult) throws Exception {
        if(bindingResult.hasErrors()) {
            LOGGER.error("The registration form entered has errors: {}", bindingResult.getAllErrors().toString());
            throw new InvalidForm();
        }

        try {
            Organization org = orgService.registerOrganization(form);
            if(org!=null)
                return org;
        } catch(DataIntegrityViolationException e) {
            bindingResult.reject("name.exists", "The supplied name is already in use");
        }

        throw new InvalidForm();
    }
 ValidationUtils.rejectIfEmptyOrWhitespace(errors, target.getOrganizationName(), "name.empty", "Please enter a name");
把那行改成经典支票行了

if(target.getOrganizationName.isEmpty())
   errors.reject("name.empty", "Please enter a name");

为了文档的缘故,有人知道为什么会这样吗?当IntelliSense建议使用该方法签名时,我的api文档是否有误?

我知道这很旧,但我只是无意中发现了它:

对我来说,
ValidationUtils.rejectIfEmptyOrWhitespace(错误,target.getOrganizationName(),“name.empty”,“请输入名称”)看起来不对

应该是:

ValidationUtils.rejectIfEmptyOrWhitespace(errors, "organizationName", "name.empty", "Please enter a name");
第二个属性是字段名,而不是其内容。ValidationUtils将采用该名称并将其转换为标准getter(在这种情况下为getOrganizationName),以检索其值并验证该值


这就是为什么它告诉您没有名为Test的属性。因为没有

您确定Spring会尝试将您的身体解析为JSON吗?将`consumes=“application/json”`添加到
@RequestMapping
(并查看请求是否失败)或检查您的请求头…@JanChimiak查看我对这个奇怪问题的奇怪答案。我的标题中的内容类型是:“application/json”。