如何将 bean 注入 POJO?

时间:2021-02-20 14:22:47

标签: java spring spring-boot spring-security

我的目标是将 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 个单独的文件:

  1. 带有@RestController、@PostMapping、@RequestBody 的文件
  2. DTO 对象的文件。
  3. 带有@Service 的文件
  4. 使用@Mapper 归档
  5. DAO 对象的文件。

通过向 PasswordEncoder POJO 注入 CreateUserModel,它将减少样板:

  1. 组合 DTO 和 DAO 对象。
  2. 使用@Service 删除文件。

1 个答案:

答案 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 删除文件。

现在您应该已经实现了您想要的,但请记住,这不被视为最佳实践。

相关问题