簡體   English   中英

(春季)我可以在循環內使用依賴項注入嗎?

[英](Spring) Can I use dependency injection inside a loop?

我目前正在使用Spring Boot應用程序,該應用程序允許用戶將類別保存到數據庫中。 我可以使我的代碼“工作”,但是,我認為它限制了我可以進行的測試數量,因此是我的問題。

控制器接收類別列表。 控制器遍歷這些類別,驗證它們,並根據它們是否有效將它們保存到數據庫中。 控制器最終返回消息列表,以便收件人可以識別已接受或拒絕的類別,等等。

我有一個模型消息列表(List),在每次迭代時,控制器會實例化一個新的模型消息(new ModelMessage()),並最終將其添加到列表中。 有沒有一種方法可以在每次迭代時注入新的ModelMessage,或者我需要使用new關鍵字嗎? 如果我確實使用了new關鍵字,我會感覺這限制了我的可測試性/將控制器與模型消息緊密耦合。

控制器:

@PostMapping("/category")
    public String saveCategoryModelToDatabase(@RequestBody CategoryModelWrapper categoryModelWrapper){
        List<CategoryModel> categoryModelList = categoryModelWrapper.getCategoryModelList();
        modelMessageList.clear();

        for(CategoryModel categoryModel : categoryModelList){
            //Resetting model
            modelMessage = new ModelMessage(); //This tightly couples my method to the ModelMessage class, which is bad for testing?
            //@Autowired modelMessage; <-- something like this? Inject a new ModelMessage with each iteration.
            modelMessage.setName(categoryModel.getName());

            //Resetting categoryModelErrors
            Errors categoryModelErrors = new BeanPropertyBindingResult(categoryModel, "categoryModel");
            categoryModelValidator.validate(categoryModel, categoryModelErrors);


            if(categoryModelErrors.hasErrors()){
                modelMessage.setStatus(ModelMessageStatusEnum.REJECTED);
                modelMessage.setReason(MODEL_MESSAGE_0004);
            }

            if(categoryModelService.save(categoryModel)){
                modelMessage.setStatus(ModelMessageStatusEnum.ACCEPTED);
            }
            else{
                modelMessage.setStatus(ModelMessageStatusEnum.REJECTED);
                modelMessage.setReason(MODEL_MESSAGE_0005);
            }
            modelMessageList.add(modelMessage);
        }

        return gson.toJson(modelMessageList);
    }

對收件人的響應示例:

[{"name":"Arts","status":"ACCEPTED"},{"name":"Business","status":"ACCEPTED"},{"name":"Gaming","status":"ACCEPTED"},{"name":"Deals","status":"REJECTED","reason":"Category rejected because of an unexpected exception, i.e. possibly due to duplicate keys."}]

謝謝你的幫助 :)

您可以將ApplicationContext(假設您有權訪問)用作ModelMessage的工廠。 但是,那真的必要嗎?

我認為您可以在Controller中創建新的ModelMessages,它只是一個數據對象,而不是服務bean。 一個junit可以檢查該方法的結果。

但是,如果您真的想使用Spring,我會看看FactoryBean ...

例:

public class ModelMessage {
  String name;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

@Component
public class ModelMessageFactory implements FactoryBean<ModelMessage> {

  @Override
  public ModelMessage getObject() throws Exception {
    return new ModelMessage();
  }

  @Override
  public Class<?> getObjectType() {
    return ModelMessage.class;
  }
}

@RunWith(SpringRunner.class)
@SpringBootTest
@SpringJUnitConfig
public class ModelMessageFactoryTest {

  @Autowired
  private ModelMessageFactory messageFactory;

  @Test
  public void testGetObject() throws Exception {

    assertNotNull("Factory is null", messageFactory);
    IModelMessage modelMessage1 = messageFactory.getObject();
    IModelMessage modelMessage2 = messageFactory.getObject();

    assertNotEquals("error object is equal", System.identityHashCode(modelMessage1),
        System.identityHashCode(modelMessage2));
  }

  @Test
  public void testGetObjectType() throws Exception {
    assertEquals(ModelMessage.class, messageFactory.getObjectType());
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM