Wpis z mikrobloga

Uczę się aktualnie Spring Data i w większości przypadków wykorzystuję interfejs CrudRepository bez dopisywania nowych deklaracji metod. W związku z tym mam wiele identycznych klas wyglądających tak:

public interface FooRespository extends CrudRepository {
}

Próbowałem wykorzystać od razu generyka do autowiązania ale niestety takie podejście nie działa. Czy jest możliwość aby uniknąć tworzenia ciągle tych samych klas?

@Autowired
private CrudRepository fooRepository;

#java #spring #programowanie
  • 10
@melonpawel: zakładając, że Repository jest klasą lekką i bezstanową, to może zrób:

public interface RepoFactory {
CrudRepository getRepo(Class clazz);
}

i wiruj fabryki?
@melonpawel implementacja:

@Component
public class DefaultRepoFactory implements RepoFactory {
public Repository getRepository(Class clazz) {
return new Repository(blablabla);
}
}

i wtedy w każdym serwisie czy innym komponencie, który potrzebuje repozytorium możesz zrobić:

@Autowired
private RepoFactory repoFactory;

i w metodach

Repository fooRepo = repoFactorygetRepository(Foo.class);

czy jakoś tak. Dawno Springa nie używałem, mogłem coś pomieszać.
@melonpawel: nie możesz tak zrobić bo masz w definicji CrudRepository adnotację @NoRepositoryBean, która Ci nie pozwala na wykorzystanie bezpośrednio @Autowired . Najprościej zrobić to tak:

public interface MyCrudRepository extends CrudRepository {
}

jak posługujesz się kluczem głównym w całej aplikacji będącym np. Integerem to też sobie możesz od razu wrzucić

public interface MyCrudRepository extends CrudRepository {
}