有没有办法将依赖项注入(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/