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