Micronaut Mastery: Using Micronaut Beans in Spring Applications
Let's learn how to use beans in Spring applications with Micronaut, a fast, lightweight Java microservice framework.
Join the DZone community and get the full member experience.
Join For FreeWe can add Micronaut beans to the application context of a Spring application. Micronaut has a MicronautBeanProcessor
class that we need to register as Spring bean in the Spring application context. We can define which Micronaut bean types need to be added to the Spring application context via the constructor of the MicronautBeanProcessor
class. This way we can use Micronaut from inside a Spring application. For example, we can use the declarative HTTP client of Micronaut in our Spring applications.
First, we need to add dependencies on Micronaut to our Spring application. In this example, we will use the Micronaut HTTP client in our Spring application and use Gradle as the build tool. We must add the following dependencies:
// File: build.gradle
...
dependencyManagement {
imports {
mavenBom 'io.micronaut:bom:1.0.0.M4'
}
}
...
dependencies {
...
annotationProcessor "io.micronaut:inject-java"
compile "io.micronaut:http-client"
compile "io.micronaut:spring"
...
}
...
Next, we register a MicronautBeanProcessor
bean in the Spring application context. We specify in the constructor that Micronaut beans annotated with @Client
must be added to the Spring application context:
// File: src/main/java/mrhaki/micronaut/SampleApplication.java
package mrhaki.micronaut;
import io.micronaut.http.client.Client;
import io.micronaut.spring.beans.MicronautBeanProcessor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class SampleApplication {
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
@Bean
public MicronautBeanProcessor httpClientMicronautBeanProcessor() {
// Register beans with @Client annotation.
// We could for example also use @Singleton
// and others, because the constructor has
// a variable number of arguments.
return new MicronautBeanProcessor(Client.class);
}
}
We add the source for our Micronaut declarative HTTP client, where we access httpbin.org as a remote web service:
// File: src/main/java/mrhaki/micronaut/HttpBinClient.java
package mrhaki.micronaut;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Post;
import io.micronaut.http.client.Client;
@Client("http://httpbin.org")
interface HttpBinClient {
@Get("/uuid")
ResponseUuidData uuid();
@Post("/anything")
ResponseData data(String message);
}
Inside a Spring controller, we use the client as a Spring bean:
// File: src/main/java/mrhaki/micronaut/HttpBinController.java
package mrhaki.micronaut;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import static org.springframework.http.MediaType.TEXT_PLAIN_VALUE;
@RestController
@RequestMapping("/sample")
public class HttpBinController {
private final HttpBinClient client;
// Inject Micronaut HTTP client via implicit
// constructor injection.
public HttpBinController(final HttpBinClient client) {
this.client = client;
}
@GetMapping(value = "/uuid", produces = TEXT_PLAIN_VALUE)
Mono<String> uuid() {
return Mono.fromCallable(() -> client.uuid().getUuid().toString());
}
@GetMapping(value = "/data")
Mono<ResponseData.MessageResponseData> data() {
return Mono.fromCallable(() -> client.data("Micronaut rocks").getJson());
}
}
Finally, we have some POJO classes with the results from the remote web service calls:
// File: src/main/java/mrhaki/micronaut/ResponseUuidData.java
package mrhaki.micronaut;
import java.util.UUID;
public class ResponseUuidData {
private UUID uuid;
public UUID getUuid() { return uuid; }
public void setUuid(final UUID uuid) { this.uuid = uuid; }
}
// File: src/main/java/mrhaki/micronaut/ResponseData.java
package mrhaki.micronaut;
public class ResponseData {
private MessageResponseData json;
public MessageResponseData getJson() { return json; }
public void setJson(final MessageResponseData json) { this.json = json; }
static class MessageResponseData {
private String message;
public String getMessage() { return message; }
public void setMessage(final String message) { this.message = message; }
}
}
It is time to start our Spring application and invoke /sample/uuid
and /sample/data
URLs to see the results:
$ curl -X GET http://localhost:8080/sample/uuid
7149a954-da9a-4bfb-ba04-4b9f814698fa
$ curl -X GET http://localhost:8080/sample/data
{"message":"Micronaut rocks"}
Written with Micronaut 1.0.0.M4 and Spring Boot 2.0.4.RELEASE.
Published at DZone with permission of Hubert Klein Ikkink, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments