避免每次检查 spring 中 dto 处的非空变量和非空变量
avoid everytime check for nonnull and nonempty variables at dto in spring
我有以下方法可以在数据为非空或非空时更新用户数据
public Users updateUser(Users requestBody) throws AppServiceException {
Users user = new Users();
try {
user = userDAO.getUserByUserId(requestBody.getUserId());
if (requestBody.getRole() != null && !requestBody.getRole().isEmpty()) {
user.setRole(requestBody.getRole());
}
if (requestBody.getUserName() != null && !requestBody.getUserName().isEmpty()) {
user.setUserName(requestBody.getUserName());
}
if (requestBody.getChannelType() != null && !requestBody.getChannelType().isEmpty()) {
user.setChannelType(requestBody.getChannelType());
}
if (requestBody.getStatus() != null && !requestBody.getStatus().isEmpty()) {
user.setStatus(requestBody.getStatus());
}
if (requestBody.getDevice() != null) {
user.setDevice(requestBody.getDevice());
}
user.setUpdatedDate(new Date());
user = userDAO.updateUser(user);
} catch (Exception e) {
e.printStackTrace();
throw new AppServiceException(AppServiceException._FAIL_TO_UPDATE);
}
return user;
}
我每次都检查 nonNull 和 isEmpty 的值。
我怎样才能避免这种情况?
您可以使用 Apache commons lang 的 StringUtils.isEmpty(java.lang.String)
Checks if a String is empty ("") or null.
如果您的代码:
if (StringUtils.isEmpty(requestBody.getStatus())) {
假设我们有两个 class:
@Data
class X {
private String field1;
}
@Data
class Y {
private String field2;
}
定义静态方法
static <F, T>void copy(F f, T t, Function<F, String> get, BiConsumer<T, String> set){
String value = get.apply(f);
if(value != null && value.isEmpty()){
set.accept(t, value);
}
}
并在您的代码中使用它:
X x = new X();
Y y = new Y();
copy(x, y, X::getField1, Y::setField2);
您可以在 getter 方法中实现此检查逻辑,即
public Optional<String> getChannelType() {
if (channelType.isEmpty() || channelType == null)
return Optional.empty();
else
return Optional.of(channelType);
}
如果它只是在具有相同变量名的 2 个 bean 之间进行复制,那么您可以使用 BeanUtils.copyProperties
来执行此操作。
这里我们可以说 BeanUtil 复制非空值。所以代码将减少到1行。
BeanUtils.copyProperties(source, destination, (.. optional parameter to copy non null value)
我有以下方法可以在数据为非空或非空时更新用户数据
public Users updateUser(Users requestBody) throws AppServiceException {
Users user = new Users();
try {
user = userDAO.getUserByUserId(requestBody.getUserId());
if (requestBody.getRole() != null && !requestBody.getRole().isEmpty()) {
user.setRole(requestBody.getRole());
}
if (requestBody.getUserName() != null && !requestBody.getUserName().isEmpty()) {
user.setUserName(requestBody.getUserName());
}
if (requestBody.getChannelType() != null && !requestBody.getChannelType().isEmpty()) {
user.setChannelType(requestBody.getChannelType());
}
if (requestBody.getStatus() != null && !requestBody.getStatus().isEmpty()) {
user.setStatus(requestBody.getStatus());
}
if (requestBody.getDevice() != null) {
user.setDevice(requestBody.getDevice());
}
user.setUpdatedDate(new Date());
user = userDAO.updateUser(user);
} catch (Exception e) {
e.printStackTrace();
throw new AppServiceException(AppServiceException._FAIL_TO_UPDATE);
}
return user;
}
我每次都检查 nonNull 和 isEmpty 的值。
我怎样才能避免这种情况?
您可以使用 Apache commons lang 的 StringUtils.isEmpty(java.lang.String)
Checks if a String is empty ("") or null.
如果您的代码:
if (StringUtils.isEmpty(requestBody.getStatus())) {
假设我们有两个 class:
@Data
class X {
private String field1;
}
@Data
class Y {
private String field2;
}
定义静态方法
static <F, T>void copy(F f, T t, Function<F, String> get, BiConsumer<T, String> set){
String value = get.apply(f);
if(value != null && value.isEmpty()){
set.accept(t, value);
}
}
并在您的代码中使用它:
X x = new X();
Y y = new Y();
copy(x, y, X::getField1, Y::setField2);
您可以在 getter 方法中实现此检查逻辑,即
public Optional<String> getChannelType() {
if (channelType.isEmpty() || channelType == null)
return Optional.empty();
else
return Optional.of(channelType);
}
如果它只是在具有相同变量名的 2 个 bean 之间进行复制,那么您可以使用 BeanUtils.copyProperties
来执行此操作。
这里我们可以说 BeanUtil 复制非空值。所以代码将减少到1行。
BeanUtils.copyProperties(source, destination, (.. optional parameter to copy non null value)