diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc index d8389743538..ad014ab9e5b 100644 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc +++ b/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc @@ -445,6 +445,13 @@ If you add a `@Bean` annotated with `@Endpoint`, any methods annotated with `@Re Endpoints can be exposed over HTTP using Jersey, Spring MVC, or Spring WebFlux. If both Jersey and Spring MVC are available, Spring MVC will be used. +The following example exposes a read operation that returns a custom object: + +[source,java,indent=0] +---- +include::{code-examples}/actuate/endpoint/CustomEndpointExample.java[tag=read] +---- + You can also write technology-specific endpoints by using `@JmxEndpoint` or `@WebEndpoint`. These endpoints are restricted to their respective technologies. For example, `@WebEndpoint` is exposed only over HTTP and not over JMX. @@ -475,10 +482,15 @@ Consider the following JSON request body: } ---- -This can be used to invoke a write operation that takes `String name` and `int counter` parameters. +This can be used to invoke a write operation that takes `String name` and `int counter` parameters, as shown in the following example: + +[source,java,indent=0] +---- +include::{code-examples}/actuate/endpoint/CustomEndpointExample.java[tag=write] +---- TIP: Because endpoints are technology agnostic, only simple types can be specified in the method signature. -In particular declaring a single parameter with a custom type defining a `name` and `counter` properties is not supported. +In particular declaring a single parameter with a `CustomData` type defining a `name` and `counter` properties is not supported. NOTE: To allow the input to be mapped to the operation method's parameters, Java code implementing an endpoint should be compiled with `-parameters`, and Kotlin code implementing an endpoint should be compiled with `-java-parameters`. This will happen automatically if you are using Spring Boot's Gradle plugin or if you are using Maven and `spring-boot-starter-parent`. diff --git a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/actuate/endpoint/CustomEndpointExample.java b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/actuate/endpoint/CustomEndpointExample.java new file mode 100644 index 00000000000..78674d700ce --- /dev/null +++ b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/actuate/endpoint/CustomEndpointExample.java @@ -0,0 +1,58 @@ +/* + * Copyright 2012-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.docs.actuate.endpoint; + +import org.springframework.boot.actuate.endpoint.annotation.Endpoint; +import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; +import org.springframework.boot.actuate.endpoint.annotation.WriteOperation; + +/** + * An example of a custom actuator endpoint. + * + * @author Stephane Nicoll + */ +@Endpoint(id = "custom") +public class CustomEndpointExample { + + // tag::read[] + @ReadOperation + public CustomData getCustomData() { + return new CustomData("test", 5); + } + // end::read[] + + // tag::write[] + @WriteOperation + public void updateCustomData(String name, int counter) { + // injects "test" and 42 + } + // end::write[] + + public static class CustomData { + + private final String name; + + private final int counter; + + public CustomData(String name, int counter) { + this.name = name; + this.counter = counter; + } + + } + +}