¡LANZAMIENTO DE MICRONAUT FRAMEWORK 3!

Hay una gran cantidad de cambios en el Framework para la versión 3, por lo que esta publicación de blog no puede cubrirlos todos. Para obtener todos los detalles del lanzamiento, consulte la documentación . Estos son los aspectos más destacados.

SIN IMPLEMENTACIÓN DE FLUJOS REACTIVOS PREDETERMINADOS

Las versiones anteriores del marco Micronaut incluían RxJava2 como una dependencia transitiva, y RxJava2 era la implementación de flujos reactivos utilizada para implementar muchas características dentro del marco. El marco de Micronaut ahora ya no expone ninguna implementación de flujos reactivos de forma predeterminada. Además, todos los usos de RxJava2 internamente se han reemplazado con Project Reactor.

Una vez que se lanzó RxJava3, tuvimos que tomar la decisión de actualizar a RxJava3 o cambiar a Reactor. Creemos que Reactor es la mejor opción porque tiene la funcionalidad para mantener el estado dentro del flujo reactivo y es más ampliamente adoptado por la comunidad.

Recomendamos que las aplicaciones que actualmente usan RxJava2 cambien a Project Reactor porque eso generará menos clases en la ruta de clases en tiempo de ejecución y menos problemas potenciales con la propagación del contexto y la conversión de tipo reactivo. Si el cambio no es posible o factible, simplemente agregue una dependencia en el 

io.micronaut.rxjava2:micronaut-rxjava2
módulo para continuar usando RxJava2.

Para las aplicaciones que utilizan Project Reactor o RxJava3, este cambio no tendrá ningún impacto.

HERENCIA DE ANOTACIONES

Esta versión incluye un cambio en la forma en que se heredan las anotaciones. En resumen, todas las anotaciones se heredaron de las interfaces o clases principales en versiones anteriores. Ahora se debe anotar una anotación 

@Inherited
para poder heredarla. Las anotaciones relacionadas con los ámbitos de los beans o los consejos de introducción / entorno ya no se heredan.

La lista completa de anotaciones que se han modificado de esta manera está disponible en nuestra documentación .

VALIDACIÓN EN TIEMPO DE COMPILACIÓN HTTP

La validación de los componentes relacionados con HTTP en tiempo de compilación se ha trasladado a un nuevo módulo, 

io.micronaut:micronaut-http-validation
. Si su aplicación está utilizando nuestro cliente o servidor HTTP, agregue esa dependencia a la ruta de clases del procesador de anotaciones para continuar con la validación de sus clases en el momento de la compilación.

ANOTACIONES DEL CICLO DE VIDA DE YAKARTA

El marco de Micronaut ahora admite 

jakarta.annotation.PreDestroy
jakarta.annotation.PostConstruct
. Recomendamos cambiar a esas anotaciones de los 
javax.annotation
equivalentes debido a problemas de licencia con el 
javax
espacio de nombres
 .

MEJORAS DEL COI

INYECCIÓN DE YAKARTA

Debido a las restricciones de marcas registradas impuestas en el espacio de nombres javax. *, El marco de Micronaut ha cambiado de 

javax.inject
las 
jakarta.inject
anotaciones como el conjunto de anotaciones que se incluye de forma predeterminada con el marco. Le recomendamos que cambie su aplicación a las nuevas anotaciones. Solo debería ser cuestión de cambiar las importaciones. Para los usos actuales de 
javax.inject.Provider
, recomendamos cambiar a 
io.micronaut.context.BeanProvider
.

javax.inject
Aún se admiten las anotaciones antiguas . Para continuar usando esas anotaciones, simplemente agregue la dependencia a su compilación que contiene las anotaciones.

INYECCIÓN POR GENÉRICOS

Ahora es posible calificar una inyección de un tipo por sus argumentos genéricos. Una clase que usa argumentos de tipo se puede apuntar especificando esos genéricos en el tipo de argumento.


@Inject
public Vehicle(Engine<V8> engine) {
   ...
}

ANOTACIONES CALIFICATIVAS

Los miembros de las anotaciones de calificador ahora se utilizan para calificar el bean que se solicita. Anteriormente, solo se usaba la presencia de la anotación.

LÍMITE DE TIPOS INYECTABLES

Ahora es posible hacer que los beans no se puedan buscar por el tipo que son, sino por un súper tipo o interfaz. Puede usar esto para evitar que una clase de implementación sea buscada directamente y forzar a que el bean sea buscado por la interfaz que implementa. Por ejemplo:


@Bean(typed = Engine.class)
class V8Engine implements Engine {

}

INTERCEPCIÓN DE AOP

Los constructores y los métodos del ciclo de vida ahora se pueden interceptar para permitir el asesoramiento de AOP sobre esos métodos. Anteriormente, a los métodos de ciclo de vida les gustaba 

@PostConstruct
@PreDestroy
no se les podía aplicar el asesoramiento de AOP.

BEANS DE FÁBRICA

Las clases de fábrica ahora pueden producir frijoles a partir de campos con la 

@Bean
anotación.

RETRABAJO DEL FILTRO DEL SERVIDOR

En el marco 2 de Micronaut, los filtros del servidor podrían haber sido llamados varias veces en el caso de que se lanzara una excepción, o algunas veces no en absoluto si el error se produjo antes de la ejecución de la ruta. Esto también permitió que los filtros manejen las excepciones lanzadas desde las rutas.

Los filtros han cambiado en Micronaut framework 3 para ser llamados siempre exactamente una vez para cada solicitud en todas las condiciones. Las excepciones ya no se propagan a los filtros; en su lugar, la respuesta de error resultante se pasa a través del flujo reactivo.

INTROSPECCIONES Y REFLEXIÓN GRAALVM

En versiones anteriores del marco Micronaut, agregar 

@Introspected
a una clase también agregaba la configuración de GraalVM para permitir el uso reflexivo de la clase. Esta fue la elección correcta antes de los avances realizados dentro del Framework, específicamente en lo que respecta a la validación y la codificación / decodificación JSON. La gran mayoría de los casos no deberían requerir ninguna reflexión para las clases introspectadas y, por lo tanto, los metadatos reflectantes para GraalVM ya no se aplican automáticamente.

Para restaurar este comportamiento para una clase individual, agregue la 

@ReflectiveAccess
anotación a la clase.

CONFIGURACIÓN DE RECURSOS DE GRAALVM

GraalVM requiere que todos los recursos, por ejemplo 

src/main/resources
, in , se declaren en un archivo de configuración para que estén disponibles en la imagen nativa. El marco de Micronaut ha realizado este trabajo automáticamente durante bastante tiempo. Antes de esta versión, ese trabajo se realizó como parte de nuestra lógica en tiempo de compilación. Debido a una serie de factores, el trabajo se ha trasladado a nuestros complementos de compilación. Este cambio debería ser perfecto para aquellos que usan nuestros complementos de compilación. Para los usuarios de Maven que no utilizan nuestro complemento de compilación, ahora es su responsabilidad crear y mantener la configuración de recursos. Para los usuarios de Gradle que no utilizan nuestros complementos de compilación, tiene la opción de aplicar el 
io.micronaut.graalvm
complemento para generar la configuración de recursos.

CAMBIOS IMPORTANTES

ANOTACIONES DE NULABILIDAD

El marco de Micronaut ya no se envía con 

@Nullable
anotaciones externas . Se anima a los usuarios a cambiar a las anotaciones de Micronaut, o deberán agregar una dependencia en el conjunto de anotaciones que prefieran.

CAMBIOS PERSONALIZADOS EN EL ALCANCE DEL BEAN

Se han rediseñado los ámbitos personalizados para que las implementaciones puedan invocar más fácilmente los 

@PreDestroy
métodos del ciclo de vida y eliminar los beans de forma más eficaz.

El marco de Micronaut ahora también rastreará cualquier bean dependiente que no defina un alcance y lo invoque de manera proactiva 

@PreDestroy
, asegurando un apagado limpio.

RUTAS DE ERROR DE ESTADO

Los métodos anotados con 

@Error(status = )
han cambiado su estado de respuesta predeterminado. En el caso de que el método no devuelva una respuesta y no especifique 
@Status
en el método, el estado de respuesta predeterminado será el estado de respuesta original (el especificado en la 
@Error
anotación).

PRIORIDAD DE RUTA DE ERROR

Anteriormente, si no se podía satisfacer una ruta o 

HttpStatusException
se lanzaba una, se buscaban las rutas para el estado HTTP relevante antes que las rutas que manejaban la excepción específica. En Micronaut framework 3, las rutas que manejan la excepción se buscarán primero, luego las rutas que manejan el estado HTTP.

DESAPROBACIONES

La gran mayoría de las clases y métodos que estaban en desuso en 2.x se han eliminado.

TIPO DE INYECCIÓN DE FÁBRICA

Anteriormente, era posible utilizar el tipo de implementación devuelto por una fábrica para buscar un bean. Ahora solo se pueden inyectar el tipo de retorno y cualquiera de sus clases o interfaces principales.

EXECUTORSERVICE INJECTION

Ya no es posible inyectar 

ExecutorService
sin un calificador. En versiones anteriores del marco de Micronaut, se habría inyectado el bucle de eventos predeterminado de Netty y ese grupo de subprocesos no debería usarse para fines generales.

ACTUALIZACIÓN FÁCIL

Para los usuarios de Java, ahora existe una integración con OpenRewrite . OpenRewrite cambia su código fuente para actualizar la aplicación de Micronaut framework 2 a 3. Esto se hace a través de un complemento de Gradle o Maven que debe agregarse a su compilación. Para obtener instrucciones sobre cómo comenzar, consulte la documentación de actualización .

FUENTE: https://micronaut.io/2021/08/18/micronaut-framework-3-released/