RestController POJO 中的 Spring 依赖注入

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


以下示例失败,NullPointerExcetion因为lowerCaseService未注入ExamplePOJO:


@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,每个子类都需要做非常不同的事情,具有不同的依赖关系。


智慧大石
浏览 200回答 3
3回答

翻阅古今

根据定义,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 应该只包含属性而不包含其他任何内容。我认为在这种情况下,我们可以通过将服务注入控制器方法来解决问题。@RestControllerpublic class ExampleController {  @Autowired  private LowerCaseService lowerCaseService;  @PostMapping("/example")  String example(@RequestBody Example example) {    return lowerCaseService. toLowerCase(example.getValue);  }}

慕斯709654

您可以实现您正在尝试实现自己的 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) {&nbsp; &nbsp; &nbsp; &nbsp; final Example example = (Example) super.afterBodyRead(body, inputMessage, parameter, targetType, converterType);&nbsp; &nbsp; &nbsp; &nbsp; final AutowireCapableBeanFactory autowireCapableBeanFactory = applicationContext.getAutowireCapableBeanFactory();&nbsp; &nbsp; &nbsp; &nbsp; autowireCapableBeanFactory.autowireBeanProperties(example, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);&nbsp; &nbsp; &nbsp; &nbsp; return example;}

侃侃无极

简单的答案是否定的,您不能,因为在 Spring 的 Context 中实例化 bean 时会注入依赖项,而这个 POJO 只是 Jackson 映射(可能)的一个实例。但是比这更重要的是架构原则,您真的不应该将您的业务服务放在您的外部模型中(示例),因为这显然违反了关注点分离。您应该在控制器类中注入您的服务,并将 DTO 作为参数传递给其方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java