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

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.

1

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.

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?

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)?

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 ;]

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