簡體   English   中英

如何將 bean 注入 POJO?

[英]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 個單獨的文件:

  1. 帶有@RestController、@PostMapping、@RequestBody 的文件
  2. DTO object 的文件。
  3. 帶有@Service 的文件
  4. 帶有@Mapper 的文件
  5. DAO object 的文件。

通過將PasswordEncoder注入CreateUserModel POJO,它將減少樣板:

  1. 結合 DTO 和 DAO object。
  2. 使用@Service 刪除文件。

只需在您的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM