spring - 如何在供应商内部注入服务。存储库为空
问题描述
我使用供应商创建了一个工厂模式。没关系,它工作得很好。正确服务的路径是可以的,但在将计算的服务内部,存储库为空。似乎没有自动接线。
我尝试使用 @Service 和 @Component 自动装配和注释类,但仍然无法正常工作。
@Service
public class Service {
public responseDTO calculate(Contract contract, Request request) {
Supplier<TypeFactory> type = TypeFactory::new;
//HOW TO AUTOWIRE THIS?
return type.get().getCalculationMethod(contract.getId()).calculate(request);
}
}
@Service
public class TypeFactory {
final static Map<Integer, Supplier<Calculator>> calculationTypeMap = new HashMap<>();
static {
calculationTypeMap.put(1, ContractOneType::new);
calculationTypeMap.put(2, ContractTwoType::new);
}
public Calculator getCalculationMethod(Integer type) {
Supplier<Calculator> method = calculationTypeMap.get(type);
if (method != null) {
return method.get();
}
throw new IllegalStateException("Type not found");
}
}
@Service
public interface Calculator {
ResponseDTO calculate(Request Request);
}
@Service
public class ContractOneType implements Calculator {
@Autowired
private ContractRepository contractRepository;
public ResponseDTO calculate(Request request) {
ResponseDTO responseDTO = new ResponseDTO();
Contract contract = contractRepository.findById(request.getId()).orElseThrow(() -> new NotFoundException("id not found"));
//some calculations here with the contract
return responseDTO;
}
}
contractRepository 为空,未自动装配。肯定是。
我的代码中的错误消息:
2019-07-08 10:19:33.078 错误 [-,21fa294c89e1e207,21fa294c89e1e207,false] 19477 --- [nio-8080-exec-1] cldtshGeneralExceptionHandler: msg="Exception", stacktrace="java.lang.NullPointerException
解决方案
我找到了一个更改我的供应商的解决方案,它正在创建新实例,我只是为我的实现创建实例并为它们设置@Autowired。
这就是为什么我的存储库没有被@Autowired。
这是我的代码:
@Service
public class TypeFactory {
final static Map<Integer, Supplier<Calculator>> calculationTypeMap = new HashMap<>();
@Autowired
ContractOneType contractOneType;
@Autowired
ContractTwoType contractTwoType;
static {
calculationTypeMap.put(1, contractOneType);
calculationTypeMap.put(2, contractTwoType);
}
public Calculator getCalculationMethod(Integer type) {
Supplier<Calculator> method = calculationTypeMap.get(type);
if (method != null) {
return method.get();
}
throw new IllegalStateException("Type not found");
}
}
@Component
public class ContractOneType implements Calculator {
@Autowired
private ContractRepository contractRepository;
public ResponseDTO calculate(Request request) {
ResponseDTO responseDTO = new ResponseDTO();
Contract contract = contractRepository.findById(request.getId()).orElseThrow(() -> new NotFoundException("id not found"));
//some calculations here with the contract
return responseDTO;
}
}
public interface Calculator {
ResponseDTO calculate(Request Request);
}
推荐阅读
- c# - 如何获取Channel中的元素个数
? - javascript - 使用电话号码登录时令牌无效
- java - 使用 invalidate() 只添加一次贴纸
- c# - Parallel.ForEach 未按预期在 C# 的 ConcurrentBag 中添加项目
- javascript - JS 速记返回第一个未定义的值
- ssh - 如何使用 Gitlab-ci 通过本地 Gitlab 运行器 SSH 到本地服务器?
- c++ - 如何解决错误:SCIP C++ 中的无效 SCIP 阶段 <10>
- javascript - 如何用Javascript替换钱“xxx”
- laravel - MethodNotAllowedHttpException 状态代码 405
- reactjs - 反应显示获取的数据问题