首页 > 解决方案 > 在所有对象的参数上运行 java

问题描述

我有一个模型:

User(id, firstName, lastName);

我使用原型中的注释从POSTJava Spring 引导框架中的请求中获取用户。@ModelAttribute

@RequestMapping(value = "/users/update", method = RequestMethod.POST)
    public User updateUser(@ModelAttribute("User") User user) {
        //persist.save(user);
        return user;
    }

POST请求中,用户可以发送带null值的参数,我想确定他们是谁。

例如:

POST要求:http://localhost:8801/users/update?id=1&firstName=itzik

@ModelAttribute会将值转换为模型User并将null值赋予未与用户一起发送的空参数。

所以结果将是:

{
    "id": 1,
    "firstName": "itzik",
    "lastName": null, 
}

我正在尝试确定哪些参数具有价值null,以防止它们在保存之前损坏我的整个数据记录。

我已经搜索了一种在所有对象参数上运行的方法,但没有找到可行的方法,

谢谢!

public class User {

    private int id;
    private String uid;
    private String firstName;
    private String lastName;
    private String email;
    private String phone;
    private int permission;
    private int department;
    private boolean deleted;

    public User(String uid, String firstName, String lastName, String email, String phone, int permission, int department, boolean deleted) {
        this.uid = uid;
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.phone = phone;
        this.permission = permission;
        this.department = department;
        this.deleted = deleted;
    }
}

标签: javaspringspring-boot

解决方案


当您使用 Spring 框架时,会在“幕后”发生序列化/反序列化,这涉及您的 POJO。

例如,进入这个端点:

@RequestMapping(value = "/users/update", method = RequestMethod.POST)
public User updateUser(@ModelAttribute("User") User user) {
    //persist.save(user);
    return user;
}

... HTTP 协议将带来一个文本/JSON 内容,它代表一个User,但不会发送一个User. 同样,当您return user;在您的方法中返回 的实例时User,客户端正在获取一个代表您的用户的序列化 Json(这是因为 Spring 在幕后将为您序列化该类)。

因此,Spring 将寻找UserJson String 的构造函数并将其反序列化为User实例。

因此,如果您的User构造函数包含空检查:

public User(String lastName) {
    this.lastName = Objects.requireNonNull(lastName, "lastName should not be null");
}

...然后,一旦 Spring 尝试初始化User实例,它就会收到一个NullPointerException将直接报告给调用者的消息。你的方法甚至不会被调用。

因此,通过User使用非空检查保护您的构造函数,您可以保证从updateUser端点内的第一行代码开始,User对象是正确形成的,无需进行任何进一步检查


完整示例:

public class User {

    private final int id; //<- make all fields final (they can't change any longer after construction)
    private final String uid;
    private final String firstName;
    private final String lastName;
    private final String email;
    private final String phone;
    private final int permission;
    private final int department;
    private final boolean deleted;

    public User(String uid, String firstName, String lastName, String email, String phone, int permission, int department, boolean deleted) {
        this.uid = Objects.requireNonNull(uid); //<- wrap all sets by requireNonNull
        this.firstName = Objects.requireNonNull(firstName);
        this.lastName = Objects.requireNonNull(lastName);
        this.email = Objects.requireNonNull(email);
        this.phone = Objects.requireNonNull(phone);
        this.permission = Objects.requireNonNull(permission);
        this.department = Objects.requireNonNull(department);
        this.deleted = Objects.requireNonNull(deleted);
    }
}

推荐阅读