Estoy tratando de implementar un repositorio Spring personalizado. Tengo la interfaz:

public interface FilterRepositoryCustom {
    List<User> filterBy(String role);
}

La implementación:

public class FilterRepositoryImpl implements FilterRepositoryCustom {
...
}

Y el repositorio "principal", extendiendo mi repositorio personalizado:

public interface UserRepository extends JpaRepository<User, String>, FilterRepositoryCustom {
...
}

Estoy usando Spring Boot y, de acuerdo con los docs:

Por defecto, Spring Boot habilitará el soporte del repositorio JPA y buscará en el paquete (y sus subpaquetes) donde se encuentra @SpringBootApplication.

Cuando ejecuto mi aplicación, aparece este error:

org.springframework.data.mapping.PropertyReferenceException: No se ha encontrado ningún filtro de propiedad ¡Por tipo de usuario!

49
Héctor 4 ene. 2017 a las 18:48

6 respuestas

La mejor respuesta

El problema aquí es que está creando FilterRepositoryImpl pero lo está utilizando en UserRepository . Debe crear UserRepositoryImpl para que esto funcione.

Lea este documento para más detalles.

Básicamente

public interface UserRepositoryCustom {
    List<User> filterBy(String role);
}

public class UserRepositoryImpl implements UserRepositoryCustom {
...
}

public interface UserRepository extends JpaRepository<User, String>, UserRepositoryCustom {
...
}

Actualización de Spring Data 2.x
Esta respuesta fue escrita para Spring 1.x. Como Matt Forsythe señaló, las expectativas de nombres cambiaron con Spring Data 2.0. La implementación cambió de the-final-repository-interface-name-with-an-additional-Impl-suffix a the-custom-interface-name-with-an-additional-Impl-suffix.

Entonces, en este caso, el nombre de la implementación sería: UserRepositoryCustomImpl.

74
Jacob van Lingen 7 nov. 2019 a las 07:55

Yo tuve el mismo problema. Compruebe si la estructura de sus paquetes se ve así

custom
   impl
      - FilterRepositoryCustomImpl.class
- FilterRepositoryCustom.class      

Porque cuando intento usar mi repositorio personalizado, no veo la implementación. (la implementación debe estar en el mismo paquete o en subpaquetes para que Spring la vea)

Quizás ayude a alguien (ノ ^ ∇ ^)

0
Andrew Mikolyk 29 jul. 2020 a las 11:49

¿Es obligatorio que customMethod() en el CustomRepository solo pueda tener parámetros definidos que sean

1.Nombre de la clase de entidad: customMethod(User user),

2.Atributos de la clase de entidad: customMethod(String firstName), aquí firstName es un atributo de la clase de entidad de usuario.

¿No puedo tener algo como customMethod (criterios CustomCriteria), la clase de criterios contiene los diversos atributos que se utilizan para construir una consulta dinámica.

P.ej. getStatusByCriteria(CustomCriteria criteria), CustomCriteria es un pojo simple anotado con @Component para que spring lo identifique.

Cuando probé esto me sale un error:

org.springframework.data.mapping.PropertyReferenceException: ¡No se encontraron criterios de propiedad para el tipo UserRepository!

1
Suraj Kumar 30 mar. 2019 a las 05:16

Vieja forma:

Entity aThing = repository.findOne(1L);

Nueva manera:

Optional<Entity> aThing = repository.findById(1L);
-5
Lankymart 7 nov. 2019 a las 08:30

Tuve el mismo problema en un proyecto mío. Resolví el problema agregando una línea en mi pom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <includes>
            <include>com/my/package/entities/*.java</include>
            <include>com/my/package/repositories/*.java</include>
            <include>com/my/package/repositories/impl/*.java</include> <!-- add this -->
        </includes>
    </configuration>
</plugin>
-1
Bruno 82 17 ene. 2019 a las 14:22

Otra forma en que este error puede ocurrir si la clase impl para FilterRepositoryCustom no se recoge en su configuración de primavera:

@EnableJpaRepositories(basePackageClasses = {RepoPackageMarker.class, FilterRepositoryCustomImpl.class})
3
user64141 18 ago. 2019 a las 19:49