如何在命令设计模式中注入存储库?

时间:2021-07-28 00:22:46

标签: java spring dependency-injection command-pattern

在几个类中,我有类似的 else if 语句,我想使用命令模式替换它们。这个想法是将 else if 主体外部化,并根据服务调用它使用其存储库。问题是我似乎找不到将存储库注入我的类的方法。我会在示例中更好地解释:

应该使用命令模式的部分代码:

private HashMap<String, BnResponseHandler> commandMap = new HashMap<>();

for (CustomerDelivery customerDelivery : list) {
    commandMap.put("true", new SuccessfulResponse(customerDelivery));
    commandMap.put("1", new ResponseCodeOne(customerDelivery));
    commandMap.put("2", new ResponseCodeTwo(customerDelivery));
    commandMap.put("3", new ResponseCodeThree(customerDelivery));
    BnResponseHandler bnResponseHandler = new DefaultHandler(customerDelivery);

    if(response.isSuccessful()){
        commandMap.get(String.valueOf(response.isSuccessful())).handle();
    } else if (response.getResponseCode() != null
        && !response.getResponseCode().equals("")){
        commandMap.get(response.getResponseCode()).handle();
    } else {
        bnResponseHandler.handle();
    }
} 

界面:

public interface BnResponseHandler {

    void handle();
}

和接口实现:

@Component
public class ResponseCodeOne implements BnResponseHandler {

    @Autowired
    private FabricationRepository fabricationRepo;
    private Fabrication fabrication;

    @Autowired
    private MovementsRepository movementsRepository;
    private StockMovements stockMovements;

    @Autowired
    private CustomerDeliveryRepository customerDeliveryRepo;
    private CustomerDelivery customerDelivery;

    public ResponseCodeOne() {
    }

    public ResponseCodeOne(Fabrication fabrication) {
        this.fabrication = fabrication;
    }

    public ResponseCodeOne(StockMovements stockMovements) {
        this.stockMovements = stockMovements;
    }

    public ResponseCodeOne(CustomerDelivery customerDelivery) {
        this.customerDelivery = customerDelivery;
    }

    @Override
    public void handle() {
        if (fabrication != null) {
            fabrication.setFG_ETAT("D");
            fabrication.setLB_ETAT("");
            fabricationRepo.save(fabrication);
        } else if (stockMovements != null) {
            stockMovements.setFG_ETAT("D");
            stockMovements.setLB_ETAT("");
            movementsRepository.save(stockMovements);
        } else if (customerDelivery != null) {
            customerDelivery.setFG_ETAT("D");
            customerDelivery.setLB_ETAT("");
            customerDeliveryRepo.save(customerDelivery);
        }
    }
}

所以大局是为我可以获得的每个可能的响应代码(在本例中为 1)设置 ResponseCode 类,并且在这些类内部执行一些依赖于存储库 bean 的业务逻辑。它还应该是灵活的,以便我可以将 ResponseCodeOne 类用于多种不同的情况(即制造、库存移动和客户交付)。我遇到的问题是我的存储库不会以这种方式注入,并且我不断收到空指针异常。有没有办法干净地注入我的存储库 bean?

1 个答案:

答案 0 :(得分:2)

我看到的主要问题是您正在使用 new 关键字创建自己的响应代码类实例,这意味着 Spring 不会自动装配它们。为了让它们成功自动装配,您需要将它们的实例注入到 for 循环所在的类中。但是,这引入了一个次要问题,您无法再从 for 循环向响应代码实例的构造函数提供对象。要解决此问题,您可以将 Fabrication/StockMovements/CustomerDelivery 实例作为参数传递给 handle()