java - RestController POJO 中的 Spring 依赖注入(inject)

标签 java spring spring-boot jackson

有没有办法将依赖项注入(inject)到 Spring RestControllers 提供的 POJO 中?例如,如果您想实现多态行为。

以下示例因 NullPointerExcetion 失败,因为 lowerCaseService 未注入(inject)到 Example POJO 中:

@RestController
public class ExampleController {

  @PostMapping("/example")
  String example(@RequestBody Example example) {
    return example.valueToLowerCase();
  }

}

@Data
@NoArgsConstructor
public class Example {

  private String value;

  @Autowired
  private LowerCaseService lowerCaseService;

  public String valueToLowerCase() {
    return lowerCaseService.toLowerCase(getValue());
  }

}

@Service
public class LowerCaseService {
  public String toLowerCase(String value) {
    return value != null ? value.toLowerCase() : null;
  }
}

请注意,这个设计的示例故意简单,不需要多态行为。我以这种方式创建它是为了帮助响应者快速理解它,而不是被 jackson 的注释所困扰。在我的实际用例中,Jackson 将生成 Example 的子类,其中每个子类都需要做非常不同的事情,具有不同的依赖关系。

最佳答案

根据定义,POJO(普通旧 Java 对象)是一个普通的 Java 对象类(即不是 JavaBean、EntityBean 等),不充当任何其他特殊角色,也不实现任何特殊接口(interface)Java 框架。这个术语是由 Martin Fowler、Rebbecca Parsons 和 Josh MacKenzie 创造的,他们相信通过创建缩写词 POJO,这些对象将拥有一个“奇特的名字”,从而让人们相信它们是值得使用的。链接:https://www.webopedia.com/TERM/P/POJO.html

换句话说,POJO 应该只包含属性而没有其他内容。

我认为在这种情况下,我们可以通过将服务注入(inject)到 Controller 方法中来解决问题。

@RestController
public class ExampleController {
  @Autowired
  private LowerCaseService lowerCaseService;

  @PostMapping("/example")
  String example(@RequestBody Example example) {
    return lowerCaseService. toLowerCase(example.getValue);
  }

}

关于java - RestController POJO 中的 Spring 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52940946/

相关文章:

java - 分析linux中正在运行的java程序的堆使用情况

java - Web 应用程序启动时出现 NoSuchMethodError

java - 在 Spring boot 中执行预定的自定义 sql 查询

java - InvalidMediaTypeException - 我受到攻击了吗?

spring-boot - 如何在 Spring Boot 中关闭 liquibase 横幅?

java - 在这个例子中使用ConcurrentMap.replace有什么意义

java - 在银行系统应用程序中访问帐户余额

java - 获取类定义中泛型的参数化类型

java - Spring:获取 FactoryBean 对象而不是 FactoryBean.getObject()

Spring Boot 2 - 将 Mono 转换为 rx.Observable?