Я прочитал ваше описание.Но я думаю, что может быть одна конечная точка контроллера, и ваш контроллер выберет другую реализацию сервиса.Например, если ваш параметр DAILY , он выберет DailyReportServiceImpl и выберет другую реализацию в зависимости от типа вашего отчета.Вы можете попробовать следующий дизайн:
@RestController
@RequestMapping
public class ReportController {
@Autowired
ReportService reportService;
@GetMapping(value = "/accounts/{accountNumber}/reports")
public Report getReport(@PathParam("accountNumber") String accountNumber,
@RequestParam("type") String type,@RequestParam("date")Date date){
if(ReportEnum.DAILY.name().equals(type))
{
reportService = new DailyReportServiceImpl();
}else if(ReportEnum.MONTHLY.name().equals(type)){
reportService = new MonthlyReportService();
}
return reportService.getReport();
}
}
И объявить интерфейс для служб:
public interface ReportService {
public Report getReport();
}
А затем реализовать эту службу из dailyreportservice и других служб: DailyReportServiceImpl willбудет выглядеть так:
public class DailyReportServiceImpl implements ReportService {
@Override
public Report getReport() {
return null;
}
}
MonthlyReportService будет выглядеть так:
public class MonthlyReportService implements ReportService {
@Override
public Report getReport() {
return null;
}
}
Объявите класс отчета:
public class Report {
}
, затем вынеобходимо определить enum:
public enum ReportEnum {
DAILY("DAILY"),
MONTHLY("MONTHLY"),
YEARLY("YEARLY");
private String name;
ReportEnum(String name) {
this.name = name;
}
public String getName() {
return name();
}
}
NB: : В любом случае, у вас есть конкретная причина для определения другой конечной точки контроллера?
Если да, вы можете определить конечные точки другим способом:вот так.
@RestController
@RequestMapping
public class ReportController {
@Autowired
ReportService reportService;
@GetMapping(value = "/accounts/{accountNumber}/reports/DAILY")
public Report getReportDaily(@PathParam("accountNumber") String accountNumber,
@RequestParam("date")Date date){
reportService = new DailyReportServiceImpl();
return reportService.getReport();
}
@GetMapping(value = "/accounts/{accountNumber}/reports/MONTHLY")
public Report getReportMonthly(@PathParam("accountNumber") String accountNumber,
@RequestParam("date")Date date){
reportService = new MonthlyReportService();
return reportService.getReport();
}
}
Но я думаю, что предыдущий - лучший дизайн.