[英]How to inject a bean into a POJO?
我的目標是將PasswordEncoder
注入CreateUserModel
POJO。
我將@Bean PasswordEncoder passwordEncoder
放在配置 class 中。
@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
注入CreateUserModel
POJO,它將減少樣板:
只需在您的 controller 中移動該過程?
@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 object。 使用@Service 刪除文件。
到目前為止,您已經實現了您想要的,但請記住,這不是最佳實踐。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.