У меня проблема с доступом к сервису в моей организации. Я знаю, кроме того, что мой код не работает, он также не рекомендуется. Итак, я хочу знать, что является лучшей практикой, если у меня есть такая проблема? Вот мой класс.
Класс контроллера:
@Controller
@RequestMapping("step")
public class TenderController {
@Autowired
StepService stepService;
@GetMapping("")
public ModelAndView index(ModelAndView mView,
@ModelAttribute(name = "result_code") String result_code,
@ModelAttribute(name = "result_message") String result_message) {
mView.addObject("stepList", stepService.getAllSteps());
mView.setViewName("pages/step/index");
return mView;
}
}
На мой взгляд html, я повторяю stepList
<tr th:each="s:${stepList}"
th:classappend="${s?.isStepNow()?'bg-success':''}">
<!-- some td -->
</tr>
Проблема в том, что для некоторых причина, я должен использовать условие if else, чтобы получить текущую дату для использования в методе isStepNow (). Один из операционной системы. Другой из базы данных. Итак, у меня возникла идея создать класс обслуживания
Вот класс обслуживания:
public interface TimeServices {
Date getNow();
}
и класс реализации:
@Service
public class TimeServicesImpl implements TimeServices {
@Value("${app.mode}")
String appMode;
@Autowired
DateDBRepository dateDBRepository;
@Override
public Date getNow() {
if(appMode.equalsIgnoreCase("GET_FROM_DB")){
Optional<DateDB> dateDBOptional = dateDBRepository.findById(1L);
if(dateDBOptional.isPresent()){
return dateDBOptional.get().getDate();
}else{
throw new IdNotExistsException();
}
}else{
return new Date();
}
}
}
Проблема в моей сущности:
@Entity
@Table(name = "step")
public class Step{
@Autowired
@Transient
TimeServices timeServices; //BAD PRACTICE AND DOESN'T WORK
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Date start;
private Date end;
public Boolean isStepNow(){
Date now = timeServices.getNow(); //THE PROBLEM
if(now.compareTo(start)>0 && end.compareTo(now)>0) {
return true;
}else{
return false;
}
}
}
Конечно, это не работает, потому что timeService всегда нулевой. У кого-нибудь есть рекомендации для решения этой проблемы?
Я знаю, что могу отредактировать свой isStepNow () в isStepNow (Date date). Затем я могу получить доступ к услуге через контроллер. Так что я могу назвать isStepNow (дата) на мой взгляд. Но я думаю, что это неэффективно при написании исходного кода, потому что мне нужно получить доступ к сервису с некоторых контроллеров, а не писать его только один раз в сущности.