Spring Data Custom Method错误:org.springframework.data.mapping.PropertyReferenceException:找不到类型的属性xxx

时间:2017-05-06 16:26:30

标签: java spring spring-data spring-data-jpa

我正在尝试创建基本存储库类来添加新的自定义方法,但是会出错。

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

我已经检查了相同问题的答案,但他们没有帮助。他们指出了命名惯例,我看不出有任何问题。

4 个答案:

答案 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" />