我想要一个工厂类,该类返回可用于进行某些验证的服务。我实施了这个课程
public class EventUpdateValidatorFactory {
public EventUpdateValidatorStrategy getValidator(EEventStatus eventStatus) {
if (SECOND_APPROVAL.equals(eventStatus)) {
return new EventSecondApprovalValidator();
} else if (APPROVED.equals(eventStatus)) {
return new EventApprovedValidator();
} else if (ACCOUNTING_HQ.equals(eventStatus)) {
return new EventAccountingHqValidator();
}
throw new IllegalArgumentException("Unknown status");
}
}
接口EventUpdateValidatorStrategy是这个
public interface EventUpdateValidatorStrategy {
default <T extends EventUpdateValidatorStrategy> void validate(User user, EventMasterData masterData, Event event, List<EventExternalSystemExpenseSave> expenses,
List<EventExternalSystemSpeakerSave> speakers, long eventId) {
this.validateMasterData(masterData, event);
this.validateSpeakers(speakers, eventId);
this.validateExpenses(expenses, eventId);
this.doUpdate(user, masterData, expenses, speakers, eventId);
}
void validateMasterData(EventMasterData masterData, Event event);
void validateExpenses(List<EventExternalSystemExpenseSave> expenses, long eventId);
void validateSpeakers(List<EventExternalSystemSpeakerSave> speakers, long eventId);
void doUpdate(User user, EventMasterData masterData, List<EventExternalSystemExpenseSave> expenses, List<EventExternalSystemSpeakerSave> speakers, long eventId);
}
EventSecondApprovalValidator是这个
@Service
@Transactional
public class EventSecondApprovalValidator implements EventUpdateValidatorStrategy {
@Autowired
private EventService eventService;
@Autowired
private ContextDateService contextDateService;
@Autowired
private EventExpenseService eventExpenseService;
@Autowired
private EventExternalSystemDAO eventExternalSystemDAO;
@Override
public void validateMasterData(LocalEventMasterData masterData, Event event) {
// some logic
}
@Override
public void validateExpenses(List<EventExternalSystemExpenseSave> expenses, long eventId) {
// some logic
}
@Override
public void validateSpeakers(List<EventExternalSystemSpeakerSave> speakers, long eventId) {
// some logic
}
@Override
public void doUpdate(User user, EventMasterData masterData, List<EventExternalSystemExpenseSave> expenses, List<EventExternalSystemSpeakerSave> speakers, long eventId) {
ofNullable(expenses).ifPresent(expensesToSave -> expensesToSave.forEach(expense -> this.eventExternalSystemDAO.updateExpense(user, expense)));
this.eventExternalSystemDAO.updateEvent(user, masterData, eventId);
}
}
其他EventApprovedValidator和EventAccountingHqValidator的实现是相似的。
从主代码中,我打电话
final EventUpdateValidatorStrategy validator = EventUpdateValidatorFactory.getValidator(event.getStatus());
validator.validate(user, eventSave.getMasterData(), event, eventSave.getExpenses(), eventSave.getSpeakers(), eventID);
其结果是,当我在EventSecondApprovalValidator]中输入所有自动连接的服务时,它们都是空的,很显然,我第一次使用该服务时会收到一个NPE。
我如何正确地使用工厂基于EEventStatus
返回我需要的服务?我想要一个工厂类,该类返回可用于进行某些验证的服务。我实现了此类public class EventUpdateValidatorFactory {public EventUpdateValidatorStrategy ...
在EventUpdateValidatorFactory.getValidator(EEventStatus)
方法中,您需要从上下文返回EventSecondApprovalValidator
bean,而不是使用new
关键字创建新实例。
手动创建对象不会让Spring执行自动装配。还考虑在Spring之前管理您的服务。