java - 在所有对象的参数上运行 java
问题描述
我有一个模型:
User(id, firstName, lastName);
我使用原型中的注释从POST
Java 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;
}
}
解决方案
当您使用 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 将寻找User
Json 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);
}
}
推荐阅读
- intellij-idea - Intellij 有办法在 Kotlin 中生成构建器类吗?
- haskell - 字符串的 Haskell 函数头作为函数的输入
- c# - 在 Open Id Connect 事件期间提示用户提供其他信息?
- php - PHP:如何更改依赖于另一个变量的变量?(新手的东西)
- puppet - 应用 puppetdb 模块时遇到问题
- elasticsearch - 在 ElasticSearch 中按多个字段搜索确切的短语
- android - 如何使用 MediaColumns#IS_PENDING 将 Base64 编码的图像保存到图库
- doctrine-orm - 月代中的学说2实体编号
- python - 将列表拆分为 X 个大小均匀的块?
- python - 概率不加到 1