我有一个接受 dto 对象的控制器。我需要更改 dto 对象中存在的字段。
@PatchMapping(value = "/update/{uuid}")
public ResponseEntity<UserDto> update(
@RequestBody UserDto userDto,
@PathVariable("uuid")UUID uuid) throws UserNotFoundException {
User updatedUser = userService.update(
userMapper.userDtoToUser(userDto),
uuid
);
return .....
}
但 userService 只能接受实体。我需要使用映射器 dto -> 实体。但是实体不能有 dto 中的空字段(假设您只需要更改一个字段)。在这种情况下该怎么办?我知道控制器不应该包含逻辑
解决此问题的两种可能方法。您必须更改服务方法以接受 dto 而不是实体,或者您必须创建一个@Component
实现的类转换器 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/convert/converter/Converter.html,覆盖转换方法并在那里进行必要的字段更改,然后@Autowire
通用转换服务 https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/convert/support/GenericConversionService.html在你的控制器中并调用genericConversionService.convert(userDto, User.class);
转换器应该如下所示:
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
@Component
public class UserDtoToUser implements Converter<UserDto, User> {
@Override
public User convert(UserDto source) {
User user = new User();
// user.set ..... for all necessary fields
return user;
}
}
EDIT
如果您想检查收到的字段的有效性,您可以简单地使用以下注释来确保您的数据正确:@NotBlank https://javaee.github.io/javaee-spec/javadocs/javax/validation/constraints/NotBlank.html- 这检查字段是否为空或空字符串,@NotNull https://docs.oracle.com/javaee/7/api/javax/validation/constraints/NotNull.html- 这检查字段是否为空,@不是空的 https://javaee.github.io/javaee-spec/javadocs/javax/validation/constraints/NotEmpty.html- 这检查字段是否为空或空集合。重要的是要记住——你must在要验证的对象之前添加 @Valid 注释(旁注 - 如果是嵌套对象,您还需要将其添加到对象字段中),因此它看起来像这样@RequestBody @Valid UserDto userDto,
然后对于 dto 来说,它应该看起来像这样:
import java.util.List;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
public class UserDto {
@NotNull
private Integer id;
@NotBlank
private String username;
@NotBlank
private String password;
@NotEmpty
private List<String> roles;
}
当然,将字段更改为 dto 中的任何内容。此外,如果您需要进行更多验证,您还可以添加许多其他验证注释。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)