Наше программное обеспечение имеет специфическое поведение, которое применяется ко всем функциональным возможностям, в большинстве случаев изменением является сущность, используемая в операциях, и для этого нам нужна конкретная реализация для уровня @Repository.
Итак, мы разрабатываем «простую» архитектуру @RestController
-> @Service
-> @Repository
с некоторыми обобщениями для работы со всеми функциями. Как это:
@RestController
@RequestMapping("test")
// This is specific implementation
public class DiariasApi implements DefaultApiInterface<DiariasDTO, DiariasDTOFilter, Integer> {
@Autowired
private DefaultService<DiariasDTO, DiariasDTOFilter, Integer> defaultService;
@Override
@GetMapping("/page")
public Page<DiariasDTO> pageSearch(final DiariasDTOFilter filter) {
return this.defaultService.pageSearch(filter);
}
@Override
@GetMapping("/detail")
public DiariasDTO detail(@PathVariable("key") final Integer key) {
return this.defaultService.detail(key);
}
}
@Service
// This is generic implementation
public class DefaultService<D extends Serializable, F extends Serializable, C> {
@Autowired
// The Problem is here.
// Here I want the call to be the specific @Repository.
private DefaultRepositoryInterface<D, F, C> defaultRepository;
@Transactional(readOnly = true)
public Page<D> pageSearch(final F filter) {
return this.defaultRepository.pageSearch(filter);
}
@Transactional(readOnly = true)
public D detail(final C key) {
return this.defaultRepository.detail(key);
}
}
@Repository
// This is specific implementation
public class DiariasRepository implements DefaultRepositoryInterface<DiariasDTO, DiariasDTOFilter, Integer> {
@Override
public Page<DiariasDTO> pageSearch(final DiariasFiltro filtro) {
//some specific code;
}
@Override
public Optional<DiariasDTO> detail(final Integer key) {
//some specific code;
}
Мы хотим реализовать только @RestController
и @Repository
для каждой функциональности, и пусть слой @Service
будет только одним универсальным компонентом, который знает, как вызывать конкретный @Repository
. Но когда мы делаем это и имеем более одной реализации, мы получаем следующее сообщение об ошибке, которое сообщает нам о проблеме с @Autowired
:
Description:
Field defaultRepository in package.DefaultService required a single bean, but 2 were found:
- conveniosRepository: defined in file ...
- diariasRepository: defined in file ...
Мы хотим, чтобы слой @Service
был уникальным, можем ли мы это сделать?