亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 233 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號