gpt4 book ai didi

java - boolean 字段的反序列化和验证

转载 作者:行者123 更新时间:2023-12-02 19:48:33 24 4
gpt4 key购买 nike

我想出了一些关于 boolean getter 的信息,我想检查一下我是否遗漏了某些内容或者它是否是 Jackson 非托管用例。
我有 2 个 Java 类 EmployeePersonalData,这两个类都有一个 boolean 属性,它们的 getter 名为 public Boolean is...() {}PersonalData 也是Employee 的一个属性。

我的类(class)的“简单”描述是:

import javax.validation.Valid;
import javax.validation.constraints.*;

import java.io.Serializable;

public class Employee implements Serializable {

private static final long serialVersionUID = 8106504890586067631L;

@NotNull
private Boolean activated;

// StackOverflow comment : isActivated and not getActivated to match the Boolean getter naming rules
public Boolean isActivated() {
return activated;
}

public void setActivated(Boolean activated) {
this.activated = activated;
}

// StackOverflow comment : @Valid to enhance child element validation
@NotNull
@Valid
private PersonalData personalData;

public PersonalData getPersonalData() {
return personalData;
}

public void setPersonalData(PersonalData personalData) {
this.personalData = personalData;
}
}

public class PersonalData implements Serializable {

private static final long serialVersionUID = -61880360094142526L;

/**
* Gender - true if man, false if woman
*/
@NotNull
private Boolean man;

// isMan and not getMan to match the Boolean getter naming rules
public Boolean isMan() {
return man;
}

public void setMan(Boolean man) {
this.man = man;
}
}

我的前端是 Angular,所以我将这些类的 Json 发送到 Controller 方法

@PostMapping("/employees")
public ResponseEntity<Employee> createEmployee(@Valid @RequestBody Employee employee) throws URISyntaxException {
// Stackoverflow comment : We don't really care of the content here
return null;
}

我尝试了 3 个用例:

  1. 有效的 JSON -> 它按预期正常工作

    { 
    "activated": true,
    "personalData": {
    "man": true
    }
    }
  2. 无效的 json,因为 activated 为 null。正如预期的那样,验证失败:激活消息的 BadRequest 必须为 NotNull

    {
    "activated": null,
    "personalData": {
    "man": true
    }
    }
  3. 无效的 Json,因为 man 为 null。 意外结果:反序列化失败:InternalServerError,消息显示无法映射personalData.man

    {
    "activated": true,
    "personalData": {
    "man": null
    }
    }

现在,如果我将 isMan() getter 重命名为 getMan(),它会修复该问题,并且第三个用例会因预期的验证问题而失败(同上第二个用例)。因此,isActivated 是好的,isMan 是不好的。

那么,是我漏掉了什么,还是 Jackson 漏掉了什么(= 要反序列化,子元素的 getter 属性必须调用 get...() 不能是 是...()) 吗?

最佳答案

首先,我建议使用不可变对象(immutable对象),正如 Joshua Block 在他的书中所写的那样。因此,尝试添加所有 args 构造函数并删除所有 setter。

PS:您可以使用 lombok 来添加注释 @AllArgsConstructor、@Getter、@Setter 等额外代码。

PSS:我不能重复这个问题。这是我的代码片段:

class ExternalClass {
private Boolean flag;
private InternalClass internalClass;

public Boolean isFlag() {
return flag;
}

public void setFlag(Boolean flag) {
this.flag = flag;
}

public InternalClass getInternalClass() {
return internalClass;
}

public void setInternalClass(InternalClass internalClass) {
this.internalClass = internalClass;
}
}

class InternalClass {
private Boolean flag;

public Boolean isFlag() {
return flag;
}

public void setFlag(Boolean flag) {
this.flag = flag;
}
}

public static void main(String... args) throws Exception {
ObjectMapper mapper = new ObjectMapper();

ExternalClass clazz1 = mapper.readValue("{\n" +
" \"flag\": true,\n" +
" \"internalClass\": {\n" +
" \"flag\": false\n" +
" }\n" +
"}", ExternalClass.class);

ExternalClass clazz2 = mapper.readValue("{\n" +
" \"flag\": null,\n" +
" \"internalClass\": {\n" +
" \"flag\": false\n" +
" }\n" +
"}", ExternalClass.class);

ExternalClass clazz3 = mapper.readValue("{\n" +
" \"flag\": true,\n" +
" \"internalClass\": {\n" +
" \"flag\": null\n" +
" }\n" +
"}", ExternalClass.class);
}

关于java - boolean 字段的反序列化和验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57213135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com