Generyczne DAO W Spring

0

Napisałem prosty interfejs DAO w Spring Data

@Repository
@Transactional
public interface GenericDAO<T, ID extends Serializable> extends JpaRepository<T, ID> {}

następnie stworzyłem interfejs serwisu

package com.jonki.Service;

import java.io.Serializable;

public interface GenericService<T, ID extends Serializable> {
    public T save(T entity);
}

i na końcu sam serwis

@Service
public class GenericServiceImpl<T, ID extends Serializable> implements GenericService<T, ID> {

    @Autowired
    private GenericDAO<T, ID> genericDAO;

    @Override
    public T save(T entity) {
        return genericDAO.save(entity);
    }
}

Problem polega na tym, ze program nawet nie chce się skompilować, bo wywala błąd

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'genericDAO': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class java.lang.Object


Caused by: java.lang.IllegalArgumentException: Not a managed type: class java.lang.Object
0

A możesz ty mi wyjaśnić co niby Spring miał stworzyć kiedy zrobiłeś:

@Service
public class GenericServiceImpl<T, ID extends Serializable> implements GenericService<T, ID> {

? o_O Jaki miałby być typ T? Chciałbym zrozumieć logikę jaką kierowałeś się pisząc ten kod...

0

GenericService to jakaś tragedia okrutna, chyba nie wiesz po co są Servisy :D
Nie serwisy nie są po to żeby wywoływac 1 metodę z repository (no dobra czasami może się tak zdarzyć, ale czasami)

Nie ma żadnych GenericDAO dodatkowych. Najpierw poczytaj dokumentacje Spring Data JPA ze zrozumieniem :
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

To jest przykładowa metoda w Service który jest Servisem:

    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public long registerUser(UserRegisterDTO userRegisterDTO) {
        String encryptedPassword = passwordEncoder.encode(userRegisterDTO.getPassword());
        User userBeforePersistence = mapRegisterFormToEntity(userRegisterDTO,encryptedPassword);//prywatna metoda
        Authority customerAuthority = authorityRepository.findBySymbol(Authority.CUSTOMER);
        userBeforePersistence.setAuthorities(Sets.newHashSet(customerAuthority));
        User persistedUser = userRepository.save(userBeforePersistence);
        mailService.send(createRegisterEmail(userRegisterDTO));//odwołanie do prywatnej metody
        return persistedUser.getUserId();
    }

Która w sumie mogłaby i tak być lepsza

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