Intenta comprender el código bien antes de usarlo a tu trabajo si ttienes algo que aportar puedes dejarlo en la sección de comentarios.
Solución:
De por lo menos, el 2.0
versión, Spring-Data-Jpa
modificado findOne()
.
Ahora, findOne()
no tiene ni la misma firma ni el mismo comportamiento.
Anteriormente, se definió en el CrudRepository
interfaz como:
T findOne(ID primaryKey);
Ahora, el sencillo findOne()
método que encontrarás en CrudRepository
es el definido en el QueryByExampleExecutor
interfaz como:
Optional findOne(Example example);
Eso es implementado finalmente por SimpleJpaRepository
la implementación por defecto del CrudRepository
interfaz.
Este método es una consulta por búsqueda de ejemplo y no desea eso como reemplazo.
De hecho, el método con el mismo comportamiento todavía está en la nueva API, pero el nombre del método ha cambiado.
Se renombró de findOne()
para findById()
en el CrudRepository
interfaz :
Optional findById(ID id);
Ahora devuelve un Optional
que no es tan malo para prevenir NullPointerException
.
Entonces, el método real para invocar ahora es Optional
.
¿Cómo usar eso?
Aprendiendo Optional
uso. Aquí hay información importante sobre su especificación:
Un objeto contenedor que puede contener o no un objeto nonull valor. Si hay un valor presente, isPresent() devolverá true y get() devolverá el valor.
Se proporcionan métodos adicionales que dependen de la presencia o ausencia de un valor contenido, como orElse() (devuelve un valor predeterminado si el valor no está presente) e ifPresent() (ejecuta un bloque de código si el valor está presente).
Algunos consejos sobre cómo usar Optional
con Optional
.
Generalmente, cuando busca una entidad por id, desea devolverla o realizar un procesamiento particular si no se recupera.
Aquí hay tres ejemplos de uso clásico.
- Suponga que si se encuentra la entidad, desea obtenerla; de lo contrario, desea obtener un valor predeterminado.
Podrías escribir:
Foo foo = repository.findById(id)
.orElse(new Foo());
o conseguir un null
valor predeterminado si tiene sentido (mismo comportamiento que antes del cambio de API):
Foo foo = repository.findById(id)
.orElse(null);
- Suponga que si se encuentra la entidad, desea devolverla; de lo contrario, desea generar una excepción.
Podrías escribir:
return repository.findById(id)
.orElseThrow(() -> new EntityNotFoundException(id));
- Supongamos que desea aplicar un procesamiento diferente según se encuentre o no la entidad (sin arrojar necesariamente una excepción).
Podrías escribir:
Optional fooOptional = fooRepository.findById(id);
if (fooOptional.isPresent())
Foo foo = fooOptional.get();
// processing with foo ...
else
// alternative processing....
El método ha sido renombrado a findById(…)
devolver un Optional
para que tengas que manejar la ausencia tú mismo:
Optional result = repository.findById(…);
result.ifPresent(it -> …); // do something with the value if present
result.map(it -> …); // map the value if present
Foo foo = result.orElse(null); // if you want to continue just like before
De hecho, en la última versión de Spring Data, findOne devuelve un opcional. Si desea recuperar el objeto del Opcional, simplemente puede usar get() en el Opcional. Sin embargo, en primer lugar, un repositorio debe devolver el opcional a un servicio, que luego maneja el caso en el que el opcional está vacío. luego, el servicio debe devolver el objeto al controlador.
Recuerda que te brindamos la opción de añadir un diagnóstico justo si tropezaste tu traba en el momento oportuno.