Я пытаюсь добавить собственный метод в мой репозиторий весны, но он бросает ошибки. Ниже приведены фрагменты кода, которые я использую. В 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
Вы класс UserDAOImplJPA
неправильно. Фактическое имя должно быть UserDAOJPAImpl
Ниже вы найдете информацию из документации.
Самый важный бит для класса, который будет найден, - это постфикс Impl имени на нем по сравнению с основным интерфейсом репозитория (см. Ниже).
Дополнительную информацию см. В разделе " Весенние документы".