Spring JPA добавить пользовательский метод

1

Я пытаюсь добавить собственный метод в мой репозиторий весны, но он бросает ошибки. Ниже приведены фрагменты кода, которые я использую. В CommonDAO есть дополнительный метод, который я пытаюсь добавить. Пользователь - это объект, на котором я пытаюсь работать. Проблема заключается в том, что Spring рассматривает метод как свойство объекта пользователя не как отдельный метод. Не могли бы вы сообщить мне, чего я не вижу?

Интерфейсы и реализации хранилища

    public interface CommonDAO<T> {
              public T merge(T t);
         }

    public interface UserDAOJPA extends JpaRepository<User, Integer>, CommonDAO<User> {
        public User findByUsername(String userName);
    }


@Repository(value="jpaBean")
public class UserDAOImplJPA implements CommonDAO<User> {

    @PersistenceContext
    private EntityManager em;

    @Override
    public User merge(User user) {
        return em.merge(user);
    }
}

Класс обслуживания

@Service
public class UserManagerJPAImpl implements UserManager {

    @Autowired
    private UserDAOJPA userDAO;


    @Override
    @Transactional
    public void insertUser(User user) {
        userDAO.save(user);
    }

    @Override
    @Transactional
    public User getUserById(int userId) {
        return userDAO.findOne(userId);
    }

    @Override
    @Transactional
    public User getUser(String username) {
        return userDAO.findByUsername(username);
    }

    @Override
    @Transactional
    public List<User> getUsers() {
        return userDAO.findAll();
    }

    @Override
    @Transactional
    public User mergeUser(User user) {
        return userDAO.merge(user);
    }

    /**
     * @param userDAO the userDAO to set
     */
    public void setUserDAO(UserDAOJPA userDAO) {
        this.userDAO = userDAO;
    }

}

Испытательный класс

public class TestTx {
    public static void main(String[] args) {
        ApplicationContext ctx =
                new ClassPathXmlApplicationContext("app-context.xml");
/*      UserManager userManagerTraditional =
                (UserManager) ctx.getBean("userManagerImpl");*/

        UserManager userManager =
                (UserManager) ctx.getBean("userManagerJPAImpl");

        User user = new User();
        user.setUsername("johndoe");
        user.setName("John Doe");

        userManager.insertUser(user);

        System.out.println("User inserted!");

        user = userManager.getUser("johndoe");

        System.out.println("\nUser fetched by username!"
                + "\nId: " + user.getId()
                + "\nUsername: " + user.getUsername()
                + "\nName: " + user.getName());

        user.setName("After change");
        userManager.mergeUser(user);
        //user = userManagerTraditional.getUserById(user.getId());

        System.out.println("\nUser fetched by ID!"
                + "\nId: " + user.getId()
                + "\nUsername: " + user.getUsername()
                + "\nName: " + user.getName());

        List<User> users = userManager.getUsers();

        System.out.println("\nUser list fetched!"
                + "\nUser count: " + users.size());
    }
}

Ошибки, которые я получаю Нет свойства merge найдено для типа User!

15: 25: 03,995 INFO a.LocalContainerEntityManagerFactoryBean: 462 - Закрытие JPA EntityManagerFactory для единицы измерения "testPU" Исключение в потоке "main" org.springframework.beans.factory.BeanCreationException: ошибка при создании компонента с именем "userDAOJPA": вызов метода init не смогли; Вложенное исключение - org.springframework.data.mapping.PropertyReferenceException: Не найдено свойства merge для типа User! на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) в org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:303) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton( DefaultSingletonBeanRegistry.java:230) в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) на org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) в org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:736) на org.spr ingframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) в org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) в org.springframework.context.support.ClassPaспасибоmlApplicationContext. (ClassPaспасибоmlApplicationContext.java: 139) в org.springframework.context.support.ClassPaспасибоmlApplicationContext. (ClassPaспасибоmlApplicationContext.java:83) в com.debopam.sprintx.TestTx.main(TestTx.java:14) Вызвано: org.springframework.data.mapping.PropertyReferenceException: Нет свойства merge найдено для типа User! на org.springframework.data.mapping.PropertyPath. (PropertyPath.java:75) в org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:327) в org.springframework.data.mapping.PropertyPath.create( PropertyPath.java.307) в org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:270) в org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:241) в org.springframework.data.repository.query.parser.Part. (Part.java:76)..parser.PartTree $ Predicate.buildTree(PartTree.java:373) в org.springframework.data.repository.query.parser.PartTree $ Predicate. (PartTree.java:353) в org.springframework.data.repository.query. parser.PartTree. (PartTree.java:84) в org.springframework.data.jpa.repository.query.PartTreeJpaQuery. (PartTreeJpaQuery.java:61) в org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ CreateQueryLookupStr ategy.resolveQuery(JpaQueryLookupStrategy.java:95) в org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:206) в org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy $ AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:73) в org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor. (RepositoryFactorySupport.java:347) в org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:185) в org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:239) в org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java: 225) at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositor yFactoryBean.java:92) на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633) на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570).. Еще 12

Теги:
spring
jpa
spring-data

1 ответ

1

Вы класс UserDAOImplJPA неправильно. Фактическое имя должно быть UserDAOJPAImpl

Ниже вы найдете информацию из документации.

Самый важный бит для класса, который будет найден, - это постфикс Impl имени на нем по сравнению с основным интерфейсом репозитория (см. Ниже).

Дополнительную информацию см. В разделе " Весенние документы".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню