我正在尝试创建基本存储库类来添加新的自定义方法,但是会出错。
@NoRepositoryBean
public interface XRepository<T, ID extends Serializable> extends JpaRepository<T, ID> {
Optional<T> xxx(ID id);
}
public class XRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements XRepository<T, ID> {
private final EntityManager entityManager;
public XRepositoryImpl(JpaEntityInformation entityInformation, EntityManager entityManager) {
super(entityInformation, entityManager);
}
@Override
public Optional<T> xxx(ID id) {
return Optional.ofNullable(findOne(id));
}
}
public interface BookRepository extends XRepository<Book, Long> {
}
堆栈追踪:
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property xxx found for type Book!
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:77) ~[spring-data-commons-1.12.6.RELEASE.jar:na]
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:329) ~[spring-data-commons-1.12.6.RELEASE.jar:na]
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:309) ~[spring-data-commons-1.12.6.RELEASE.jar:na]
我已经检查了相同问题的答案,但他们没有帮助。他们指出了命名惯例,我看不出有任何问题。
答案 0 :(得分:0)
Spring data mongo适用于类的命名约定。如果您的存储库接口名为XXXRepository,那么您的自定义存储库接口应命名为XXXRespositoryCustom(RepositoyName + Custom),您的实现类应命名为XXXRepositoryImpl。只有这样才能读取您的自定义实现。
答案 1 :(得分:0)
你很亲密,但你的班级命名是造成你问题的原因。试试这个:
sharedPreferences.getString("title", "title");
使用当前的类定义,Spring将BookRepository视为XRepository,作为将用于实现API的类。它正在尝试使用其method-name-to-query translation来实施您的public interface XRepositoryOperations<T, ID extends Serializable> {
Optional<T> xxx(ID id);
}
public interface BookRepository extends JpaRepository<Book, Long>, XRepositoryOperations<Book, Long> {
}
public class XRepositoryImpl<T, ID extends Serializable> implements XRepositoryOperations<T, ID> {
@Autowired private BookRepository bookRepository;
@Override
public Optional<T> xxx(ID id) {
return Optional.ofNullable(bookRepository.findOne(id));
}
}
方法。如果要从此方法自动实现中免除方法,则需要在单独的接口中定义它们,然后让存储库接口扩展它。这是将在您将定义的xxx
存储库类中实现的类。
修改的
另一个选择,如果您使用Java 8并希望将所有内容保留在基类中,那么将提供Impl
方法的默认实现:
xxx
答案 2 :(得分:0)
正如@Manish指出的那样,有一个我失踪的配置:
使Spring Data Infrastructure了解自定义存储库 使用@EnableJpaRepositories
的基类
@Configuration
@EnableJpaRepositories(repositoryBaseClass = XRepositoryImpl.class)
class ApplicationConfiguration { … }
答案 3 :(得分:-1)
您正在使用Spring Data JPA。您必须在存储库中使用@Repository
。并将以下代码用于ApplicationContext.xml:
<context:component-scan annotation-config="true"
base-package="com.demo.test" />
<context:annotation-config />
<jpa:repositories base-package="com.demo.test.repository" />
<tx:annotation-driven transaction-manager="transactionManager" />