我的目标是将 PasswordEncoder
注入 CreateUserModel
POJO。
我将 @Bean PasswordEncoder passwordEncoder
放在一个配置类中。
@Configuration
public class Config {
@Bean
PasswordEncoder getPasswordEncoder() {
return new BCryptPasswordEncoder(10);
}
}
这就是我希望我的 POJO 的样子:
public class CreateUserModel {
private String username;
private String password;
private String name;
private String role;
private final PasswordEncoder passwordEncoder;
public CreateUserModel(PasswordEncoder passwordEncoder, String username, String password, String name, String role) {
this.passwordEncoder = passwordEncoder;
this.username = username;
this.password = passwordEncoder.encode(password);
this.name = name;
this.role = role;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getName() {
return name;
}
public String getRole() {
return role;
}
}
这就是我将如何使用 CreateUserModel
POJO。
@RestController
public class OrganizationController {
@PostMapping("/organization/createuser")
public CreateUserModel createUser(@RequestBody CreateUserModel user) {
return user;
}
}
用户将发送带有正文的 POST 请求:
{
"username": "user",
"passsword": "secret",
"name": "user client",
"role": "1"
}
我向 /organization/createuser
发送 POST 请求的预期结果是:
{
"username": "user",
"passsword": "alv4ko023j4v2lkralfj",
"name": "user client",
"role": "1"
}
我的实际结果,服务器抛出
2021-02-20 21:32:26.614 WARN 202592 --- [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `com.example.satpamspringboot.model.organization.CreateUserModel`, problem: `java.lang.NullPointerException`; nested exception is com.fasterxml.jackson.databind.exc.ValueInstantiationException: Cannot construct instance of `com.example.satpamspringboot.model.organization.CreateUserModel`, problem: `java.lang.NullPointerException`
at [Source: (PushbackInputStream); line: 6, column: 1]]
我能想到的唯一解决方案是使用 DTO 模式,它需要 5 个单独的文件:
通过向 PasswordEncoder
POJO 注入 CreateUserModel
,它将减少样板:
答案 0 :(得分:0)
只需在控制器中移动进程?
@RestController
public class OrganizationController {
@Autowired
PasswordEncoder passwordEncoder;
@PostMapping("/organization/createuser")
public CreateUserModel createUser(@RequestBody CreateUserModel user) {
String password = passwordEncoder.encode(user.getPassword());
return new CreateUserModel(user.getUsername(), password, user.getName(), user.getRole());
}
}
然后更新你的 POJO
public class CreateUserModel {
private String username;
private String password;
private String name;
private String role;
public CreateUserModel(String username, String password, String name, String role) {
this.username = username;
this.password = password
this.name = name;
this.role = role;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getName() {
return name;
}
public String getRole() {
return role;
}
}
<块引用>
通过将 PasswordEncoder 注入 CreateUserModel POJO,它将 减少样板:
组合 DTO 和 DAO 对象。使用@Service 删除文件。
现在您应该已经实现了您想要的,但请记住,这不被视为最佳实践。