Micronaut:not able to connect MySQL Database and create schema with tables using Hibernate

I am trying to connect MySQL database using Hibernate while creating small Micronaut POC. But I am unable to create connection and schema/entities are not created.

Please help me I am stuck at this

I have gone through

http://guides.micronaut.io/micronaut-data-access-jpa-hibernate/guide/index.html

but of no use

Following is my code :

build.gradle file dependencies

dependencies {

compile "io.micronaut:micronaut-http-server-netty"
compile "io.micronaut.configuration:micronaut-hibernate-jpa"
annotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion")
annotationProcessor "io.micronaut:micronaut-inject-java"
annotationProcessor "io.micronaut:micronaut-validation"
annotationProcessor "io.micronaut.configuration:micronaut-openapi"
annotationProcessor "io.micronaut.data:micronaut-data-processor"
implementation platform("io.micronaut:micronaut-bom:$micronautVersion")
implementation "io.micronaut:micronaut-inject"
implementation "io.micronaut:micronaut-validation"
implementation "io.micronaut:micronaut-runtime"
implementation "io.micronaut.configuration:micronaut-jdbc-tomcat"
implementation "io.swagger.core.v3:swagger-annotations"
implementation "io.micronaut:micronaut-http-client"
implementation "io.micronaut.configuration:micronaut-hibernate-jpa" // <1>
implementation "io.micronaut.configuration:micronaut-jdbc-hikari" // <2>
implementation "io.micronaut:micronaut-http-server-netty"
implementation "io.micronaut.data:micronaut-data-hibernate-jpa"
implementation "javax.annotation:javax.annotation-api"
testAnnotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion")
testAnnotationProcessor "io.micronaut:micronaut-inject-java"
testImplementation platform("io.micronaut:micronaut-bom:$micronautVersion")
testImplementation "org.junit.jupiter:junit-jupiter-api"
testImplementation "io.micronaut.test:micronaut-test-junit5"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine"
runtimeOnly "ch.qos.logback:logback-classic:1.2.3"
compile group: 'mysql', name: 'mysql-connector-java', version:'8.0.13'}

application.yml file :

  micronaut:
  application:
    name: demoapp
  server:
    port: 8081

datasources:
  default:
    url: dbc:mysql://localhost:3306/Micronaut
    username: root
    password: password
    driverClassName: "com.mysql.cj.jdbc.Driver"
    dialect: MYSQL
jpa:
  default:
    packages-to-scan: "demoapp.entity"
    properties:
      hibernate:
        hbm2ddl:
          auto: update
      show_sql: true

Controller

@Controller("/hello")
public class HelloController {

    private GenreRepo genreRepo;

    @Post(value = "/save")
    public String saveGenre() {
        Genre entity = new Genre();
        entity.setId(Long.valueOf(10));
        entity.setName("dempApp");
        System.out.println("entity::"+ entity.getId());
        genreRepo.save(entity);
        return "save entity success" ;
    }
}

Entity:

@Entity
@Table(name = "genre")
public class Genre {

    public Genre() {}

    public Genre(@NotNull String name) {
        this.name = name;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotNull
    @Column(name = "name", nullable = false, unique = true)
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    } }

Error :

    13:33:01.881 [pool-1-thread-3] ERROR i.m.h.s.netty.RoutingInBoundHandler - Unexpected error occurred: null
java.lang.NullPointerException: null
    at demoapp.controller.HelloController.saveGenre(HelloController.java:50)
    at demoapp.controller.$HelloControllerDefinition$$exec4.invokeInternal(Unknown Source)
    at io.micronaut.context.AbstractExecutableMethod.invoke(AbstractExecutableMethod.java:146)
    at io.micronaut.context.DefaultBeanContext$BeanExecutionHandle.invoke(DefaultBeanContext.java:3016)
    at io.micronaut.web.router.AbstractRouteMatch.execute(AbstractRouteMatch.java:228)
    at io.micronaut.web.router.RouteMatch.execute(RouteMatch.java:122)
    at io.micronaut.http.server.netty.RoutingInBoundHandler.lambda$buildResultEmitter$16(RoutingInBoundHandler.java:1460)
    at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:71)
    at io.reactivex.Flowable.subscribe(Flowable.java:14935)
    at io.reactivex.internal.operators.flowable.FlowableMap.subscribeActual(FlowableMap.java:37)
    at io.reactivex.Flowable.subscribe(Flowable.java:14935)
    at io.reactivex.internal.operators.flowable.FlowableSwitchIfEmpty.subscribeActual(FlowableSwitchIfEmpty.java:32)
    at io.reactivex.Flowable.subscribe(Flowable.java:14935)
    at io.reactivex.Flowable.subscribe(Flowable.java:14882)
    at io.micronaut.http.server.context.ServerRequestContextFilter$1.subscribe(ServerRequestContextFilter.java:66)
    at io.reactivex.internal.operators.flowable.FlowableFromPublisher.subscribeActual(FlowableFromPublisher.java:29)
    at io.reactivex.Flowable.subscribe(Flowable.java:14935)
    at io.reactivex.Flowable.subscribe(Flowable.java:14882)
    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.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:830)

Upvotes: 0

Views: 1608

Answers (2)

Nob Hokleng
Nob Hokleng

Reputation: 69

In your application.yml missing 'j' in url:

  micronaut:
  application:
    name: demoapp
  server:
    port: 8081

datasources:
  default:
    url: jdbc:mysql://localhost:3306/Micronaut
    username: root
    password: password
    driverClassName: "com.mysql.cj.jdbc.Driver"
    dialect: MYSQL
jpa:
  default:
    packages-to-scan: "demoapp.entity"
    properties:
      hibernate:
        hbm2ddl:
          auto: update
      show_sql: true

Upvotes: 0

cgrim
cgrim

Reputation: 5031

In your case it is problem with dependency injection.

Add constructor which will initialize the genreRepo field:

@Controller("/hello")
public class HelloController {

    private final GenreRepo genreRepo;

    public HelloController(final GenreRepo genreRepo) {
        this.genreRepo = genreRepo;
    }

    ...
}

Or Annotate the field with @Inject:

@Controller("/hello")
public class HelloController {

    @Inject
    GenreRepo genreRepo;

    ...
}

Micronaut will then automatically inject GenreRepo instance into your controller.

Upvotes: 3

Related Questions