为了账号安全,请及时绑定邮箱和手机立即绑定

RestController POJO 中的 Spring 依赖注入

RestController POJO 中的 Spring 依赖注入

智慧大石 2021-12-01 19:37:51
有没有办法将依赖项注入 Spring RestControllers 提供的 POJO 中?例如,如果您想实现多态行为。以下示例失败,NullPointerExcetion因为lowerCaseService未注入ExamplePOJO:@RestControllerpublic class ExampleController {  @PostMapping("/example")  String example(@RequestBody Example example) {    return example.valueToLowerCase();  }}@Data@NoArgsConstructorpublic class Example {  private String value;  @Autowired  private LowerCaseService lowerCaseService;  public String valueToLowerCase() {    return lowerCaseService.toLowerCase(getValue());  }}@Servicepublic class LowerCaseService {  public String toLowerCase(String value) {    return value != null ? value.toLowerCase() : null;  }}请注意,这个人为的示例故意简单并且不需要多态行为。我以这种方式创建它是为了帮助响应者快速理解它,而不会被 Jackson 的注释所困扰。在我的实际用例中,Jackson 将生成 的子类Example,每个子类都需要做非常不同的事情,具有不同的依赖关系。
查看完整描述

3 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

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


换句话说,POJO 应该只包含属性而不包含其他任何内容。


我认为在这种情况下,我们可以通过将服务注入控制器方法来解决问题。


@RestController

public class ExampleController {

  @Autowired

  private LowerCaseService lowerCaseService;


  @PostMapping("/example")

  String example(@RequestBody Example example) {

    return lowerCaseService. toLowerCase(example.getValue);

  }


}


查看完整回答
反对 回复 2021-12-01
?
慕斯709654

TA贡献1840条经验 获得超5个赞

您可以实现您正在尝试实现自己的 RequestBodyAdviceAdapter ......基本上涉及 3 个步骤:


创建一个扩展 RequestBodyAdviceAdapter 并实现 ApplicationContextAware 的类(因此您可以访问应用程序上下文)。

实现supports()方法:

return ((Class) targetType).isAssignableFrom(Example.class);

覆盖 afterRead() 方法:

public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {

        final Example example = (Example) super.afterBodyRead(body, inputMessage, parameter, targetType, converterType);

        final AutowireCapableBeanFactory autowireCapableBeanFactory = applicationContext.getAutowireCapableBeanFactory();

        autowireCapableBeanFactory.autowireBeanProperties(example, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);

        return example;

}


查看完整回答
反对 回复 2021-12-01
?
侃侃无极

TA贡献2051条经验 获得超10个赞

简单的答案是否定的,您不能,因为在 Spring 的 Context 中实例化 bean 时会注入依赖项,而这个 POJO 只是 Jackson 映射(可能)的一个实例。

但是比这更重要的是架构原则,您真的不应该将您的业务服务放在您的外部模型中(示例),因为这显然违反了关注点分离。

您应该在控制器类中注入您的服务,并将 DTO 作为参数传递给其方法。


查看完整回答
反对 回复 2021-12-01
  • 3 回答
  • 0 关注
  • 199 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信