Pet Clinic,@Autowired i beany w innej klasie, NoUniqueBeanDefinitionException,

2016-08-01 15:26
0

Probuje napisac helloroldowy mvc pet clinic.

Stworzylem sobie kilka encji: Owner, Pet, Vet, Visit, Phone.

Dla tych encji stworzyłem interface


public interface StandardDaoAction<T> {
    public T get(int id);
    public void remove(int id);
    public void add(T Type);
    public void update(T type);
    public List<T> getAll();
}

kazda z tych encji implementuje w/w interface, na przykladzie Owner.class:

@Repository
public class OwnerDaoImpl implements StandardDaoAction<Owner> {

    @PersistenceContext
    EntityManager em;

    @Transactional
    public Owner get(int id) {
        return em.find(Owner.class, id);
    }

    @Transactional
    public void remove(int id) {
         em.remove(get(id));
    }

    @Transactional
    public void add(Owner owner) {
        em.persist(owner);
    }

    @Transactional
    public void update(Owner owner) {
        em.merge(owner);
    }

    @SuppressWarnings("unchecked")
    @Transactional
    public List<Owner> getAll() {
        return em.createQuery("From Owner").getResultList();
    }

}

pozniej stworzylem controllery:

@Controller
public class OwnerController {

    @Autowired
    StandardDaoAction<Owner> ownerDao;

@Controller
public class VisitController {

    @Autowired
    StandardDaoAction<Pet> petDao;

I teraz gdy do kontrollera VisitController dodam

@Autowired
    StandardDaoAction<Owner> ownerDao;

dostaje Exception:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'visitController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: pl.kaczynski.dao.StandardDaoAction pl.kaczynski.controller.VisitController.ownerDao; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [pl.kaczynski.dao.StandardDaoAction] is defined: expected single matching bean but found 3: ownerDaoImpl,petDaoImpl,vetDaoImpl

dopoki istnieja tylko jedne definicje @Autowired dla beanow kazdej implementacji interfejsu, dopoty wszystko dziala, wiec myslalem ze to autowired by type, jest problemem i próbowalem to roziwazac @Qualifier, jednak to nie bangla.

W prostszym projekcie z jedna klasa encji , w kontrolerze moge sobie definiowac dowolna ilosc beanow tej samej klasy i smiga wszystko, wiec tutaj zaczalem podejrzewac przyczyne w generycznym interfejsie, koniec koncow zglupialem juz totalnie i prosze Was o pomoc z tym.

edytowany 3x, ostatnio: filemonczyk, 2016-08-01 15:29

Pozostało 580 znaków

2016-08-01 16:28
Swr

Zakladam, ze uzywasz spring 3. Musisz uzyc @Qualifier tak jak wspomniales.

Spring 4 sobie radzi z generycznymi beanami (oczywiscie, gdy stworzysz dwa beany implementujace StandardDaoAction<owner> to tez sobie nie poradzi bo nie ogarnie juz ktory pozniej wstrzykiwac)

BTW, @Transactional na DAO nie jest najlepsze. @Transactional powinno byc na wyzszej warstwie, jakims serwisie.

edytowany 5x, ostatnio: Swr, 2016-08-01 17:44

Pozostało 580 znaków

2016-08-01 17:40
0

ok, ddzieki za odpowiedz,
spowodowalo to ze jeszcze raz podszedlem do tego @qualifier, wczesniej robilem od poczatku dobrze, jednak value mialem zły, tzn robielm "OwnerDaoImpl" zamiast "ownerDaoImpl".

Transactional jak najwyzej z jakich wzgledów?

edytowany 1x, ostatnio: filemonczyk, 2016-08-01 17:41
jak nie jestes pewny to zawsze mozesz nadac Beanowi wlasny name @Repository(&quot;myName&quot;) - Swr 2016-08-01 17:49

Pozostało 580 znaków

2016-08-01 17:44
Swr
0
filemonczyk napisał(a):

Transactional jak najwyzej z jakich wzgledów?

A jak zechcesz uzyc add i remove to jak to opakujesz w transakcje (w aktualnym kodzie)?

edytowany 1x, ostatnio: Swr, 2016-08-01 17:46

Pozostało 580 znaków

2016-08-01 17:44
0

@filemonczyk choćby wydajnościowych, ale też logicznych -> sensowne jest zwykle odwrócenie całej operacji jeśli coś się wywaliło, a nie tylko jej fragmentu. Jak masz w serwisie do przelewów bankowych że najpierw userowi zmniejszach liczbę dolarów a potem w następnej operacji zwiększasz drugiemu userowi to słabo by było jakby wywalenie sie tej drugiej operacji nie cofało także pierwszej ;]


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0