J'évalue micronaut et j'essaye de porter une petite application en tant que projet pilote. J'ai rencontré un problème concernant les sources de données / référentiels.
J'ai l'application.yml suivante:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>bling.application</groupId> <artifactId>bling-application</artifactId> <version>0.1</version> <properties> <micronaut.version>1.2.9</micronaut.version> <jdk.version>1.8</jdk.version> <maven.compiler.target>${jdk.version}</maven.compiler.target> <maven.compiler.source>${jdk.version}</maven.compiler.source> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <exec.mainClass>my.package.bling.Application</exec.mainClass> <maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version> <maven-failsafe-plugin.version>2.22.2</maven-failsafe-plugin.version> <mans-core.version>1.0.16-SNAPSHOT</mans-core.version> <okhttp.version>3.11.0</okhttp.version> </properties> <repositories> <repository> <id>jcenter.bintray.com</id> <url>https://jcenter.bintray.com</url> </repository> </repositories> <dependencyManagement> <dependencies> <dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-bom</artifactId> <version>${micronaut.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>${okhttp.version}</version> </dependency> <dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-inject</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-validation</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-runtime</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-http-server-netty</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>io.micronaut</groupId> <artifactId>micronaut-http-client</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>io.micronaut.data</groupId> <artifactId>micronaut-data-hibernate-jpa</artifactId> <version>1.0.0.M5</version> </dependency> <dependency> <groupId>io.micronaut.configuration</groupId> <artifactId>micronaut-hibernate-jpa</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.micronaut.test</groupId> <artifactId>micronaut-test-junit5</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>${exec.mainClass}</mainClass> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.6.0</version> <configuration> <executable>java</executable> <arguments> <argument>-classpath</argument> <classpath/> <argument>-noverify</argument> <argument>-XX:TieredStopAtLevel=1</argument> <argument>-Dcom.sun.management.jmxremote</argument> <argument>${exec.mainClass}</argument> </arguments> </configuration> </plugin> </plugins> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>${maven-surefire-plugin.version}</version> <configuration> <detail>true</detail> <includes> <include>%regex[.*]</include> </includes> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>${maven-failsafe-plugin.version}</version> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <compilerArgs> <arg>-parameters</arg> </compilerArgs> <annotationProcessorPaths> <path> <groupId>io.micronaut</groupId> <artifactId>micronaut-inject-java</artifactId> <version>1.2.9</version> </path> <path> <groupId>io.micronaut</groupId> <artifactId>micronaut-validation</artifactId> <version>1.2.9</version> </path> <path> <groupId>io.micronaut.data</groupId> <artifactId>micronaut-data-processor</artifactId> <version>1.0.0.M5</version> </path> </annotationProcessorPaths> </configuration> <executions> <execution> <id>test-compile</id> <goals> <goal>testCompile</goal> </goals> <configuration> <compilerArgs> <arg>-parameters</arg> </compilerArgs> <annotationProcessorPaths> <path> <groupId>io.micronaut</groupId> <artifactId>micronaut-inject-java</artifactId> <version>1.2.9</version> </path> <path> <groupId>io.micronaut</groupId> <artifactId>micronaut-validation</artifactId> <version>1.2.9</version> </path> <path> <groupId>io.micronaut.data</groupId> <artifactId>micronaut-data-processor</artifactId> <version>1.0.0.M5</version> </path> </annotationProcessorPaths> </configuration> </execution> </executions> </plugin> </plugins> </pluginManagement> </build> </project>
J'ai défini une interface de référentiel simple comme suit:
14:38:37.307 [pool-1-thread-4] ERROR i.m.h.s.netty.RoutingInBoundHandler - Unexpected error occurred: No backing RepositoryOperations configured for repository. Check your configuration and try again io.micronaut.context.exceptions.ConfigurationException: No backing RepositoryOperations configured for repository. Check your configuration and try again at io.micronaut.data.intercept.DataIntroductionAdvice.findInterceptor(DataIntroductionAdvice.java:109) at io.micronaut.data.intercept.DataIntroductionAdvice.intercept(DataIntroductionAdvice.java:77) at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:69) at my.package.entity.repository.CompanyRepository$Intercepted.findByName(Unknown Source) at my.package.bling.BlingExportBean.getProductionCompanyByName(BlingExportBean.java:519) at my.package.bling.BlingExportBean.doExport(BlingExportBean.java:167) at my.package.bling.BlingExportBean.export(BlingExportBean.java:112) at my.package.bling.BlingExportResource.export(BlingExportResource.java:20) at my.package.bling.$BlingExportResourceDefinition$$exec1.invokeInternal(Unknown Source) at io.micronaut.context.AbstractExecutableMethod.invoke(AbstractExecutableMethod.java:147) at io.micronaut.context.DefaultBeanContext$BeanExecutionHandle.invoke(DefaultBeanContext.java:2844) at io.micronaut.web.router.AbstractRouteMatch.execute(AbstractRouteMatch.java:235) at io.micronaut.web.router.RouteMatch.execute(RouteMatch.java:122) at io.micronaut.http.server.netty.RoutingInBoundHandler.lambda$buildResultEmitter$17(RoutingInBoundHandler.java:1400) at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:71) at io.reactivex.Flowable.subscribe(Flowable.java:14918) at io.reactivex.Flowable.subscribe(Flowable.java:14865) at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:68) at io.reactivex.Flowable.subscribe(Flowable.java:14918) at io.reactivex.internal.operators.flowable.FlowableMap.subscribeActual(FlowableMap.java:37) at io.reactivex.Flowable.subscribe(Flowable.java:14918) at io.reactivex.Flowable.subscribe(Flowable.java:14865) at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:68) at io.reactivex.Flowable.subscribe(Flowable.java:14918) at io.reactivex.internal.operators.flowable.FlowableSwitchIfEmpty.subscribeActual(FlowableSwitchIfEmpty.java:32) at io.reactivex.Flowable.subscribe(Flowable.java:14918) at io.reactivex.Flowable.subscribe(Flowable.java:14865) at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:68) at io.reactivex.Flowable.subscribe(Flowable.java:14918) at io.reactivex.Flowable.subscribe(Flowable.java:14868) at io.micronaut.http.context.ServerRequestTracingPublisher.lambda$subscribe$0(ServerRequestTracingPublisher.java:52) at io.micronaut.http.context.ServerRequestContext.with(ServerRequestContext.java:52) at io.micronaut.http.context.ServerRequestTracingPublisher.subscribe(ServerRequestTracingPublisher.java:52) at io.reactivex.internal.operators.flowable.FlowableFromPublisher.subscribeActual(FlowableFromPublisher.java:29) at io.reactivex.Flowable.subscribe(Flowable.java:14918) at io.reactivex.Flowable.subscribe(Flowable.java:14865) at io.micronaut.reactive.rxjava2.RxInstrumentedFlowable.subscribeActual(RxInstrumentedFlowable.java:68) at io.reactivex.Flowable.subscribe(Flowable.java:14918) at io.reactivex.Flowable.subscribe(Flowable.java:14865) at io.reactivex.internal.operators.flowable.FlowableSubscribeOn$SubscribeOnSubscriber.run(FlowableSubscribeOn.java:82) at io.reactivex.internal.schedulers.ExecutorScheduler$ExecutorWorker$BooleanRunnable.run(ExecutorScheduler.java:288) at io.reactivex.internal.schedulers.ExecutorScheduler$ExecutorWorker.run(ExecutorScheduler.java:253) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: io.micronaut.context.exceptions.NoSuchBeanException: No bean of type [io.micronaut.data.operations.PrimaryRepositoryOperations] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor). at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:1974) at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:610) at io.micronaut.data.intercept.DataIntroductionAdvice.findInterceptor(DataIntroductionAdvice.java:106) ... 44 common frames omitted
Lorsque ./mvnw compile exec:exec
l'application en mode test ( ./mvnw compile exec:exec
), elle démarre sans erreur. Cependant, lorsque je demande un point final qui exerce le référentiel d'entreprise, je reçois l'exception suivante:
package my.package.entity.repository; import my.package.entity.Company; import io.micronaut.data.annotation.Repository; import io.micronaut.data.repository.CrudRepository; @Repository public interface CompanyRepository extends CrudRepository<Company, Long> { Company findByName(String name); }
La trace de la pile indique que quelque chose manque dans le contexte de l'application (vraisemblablement PrimaryRepositoryOperations) mais je ne sais pas ce que c'est. Comment puis-je corriger cette erreur? Je suis nouveau sur micronaut et je suppose qu'il me manque une dépendance ou une configuration cruciale.
Pour un contexte supplémentaire mon pom.xml:
micronaut: application: name: bling-application datasources: default: url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE driverClassName: org.h2.Driver username: sa password: '' schema-generate: CREATE_DROP dialect: H2 jpa: default: entity-scan: packages: 'my.package.entity' properties: hibernate: bytecode: provider: none hbm2ddl: auto: update
5 Réponses :
Le problème était des dépendances manquantes / conflictuelles dans mon fichier pom. Pour résoudre j'ai ajouté cette dépendance:
<dependency> <groupId>io.micronaut.configuration</groupId> <artifactId>micronaut-hibernate-jpa</artifactId> <scope>compile</scope> </dependency>
Et enlevé celui-ci:
<dependency> <groupId>io.micronaut.configuration</groupId> <artifactId>micronaut-jdbc-tomcat</artifactId> <scope>runtime</scope> </dependency>
J'ai un écouteur d'événements qui interroge la base de données au démarrage de l'application. Si la base de données est inaccessible, elle lève également cette exception.
No bean of type [io.micronaut.data.operations.PrimaryRepositoryOperations] exists
.
@Singleton open class NativeUserAuthorization( private val userService: UserServiceOperations): ApplicationEventListener<ServerStartupEvent> { override fun onApplicationEvent(event: ServerStartupEvent?) { // database access here } }
J'ai eu la même erreur et cela a été causé par un nom de package incorrect dans la propriété entity-scan
.
J'ai essayé les dépendances EXACTEMENT comme dans https://github.com/micronaut-projects/micronaut-data/blob/master/examples/example-jdbc/build.gradle et cela a fonctionné.
D'accord, une autre réponse qui peut être utile dans ce cas particulier auquel je faisais face. J'ai donc eu un service qui n'était pas injecté après avoir appliqué les annotations de validation. Ainsi, le correctif clairement mentionné sur la page de documentation est:
https://docs.micronaut.io/snapshot/guide/index.html#datavalidation
Pour Gradle
<dependency> <groupId>io.micronaut.beanvalidation</groupId> <artifactId>micronaut-hibernate-validator</artifactId> </dependency>
Pour Maven:
implementation("io.micronaut.beanvalidation:micronaut-hibernate-validator")