Skip to content

Commit

Permalink
Introduce Spring Boot 3
Browse files Browse the repository at this point in the history
  • Loading branch information
ulischulte committed Mar 4, 2022
1 parent 9bd8a88 commit 5858fa5
Show file tree
Hide file tree
Showing 25 changed files with 86 additions and 65 deletions.
12 changes: 8 additions & 4 deletions pom.xml
Expand Up @@ -26,7 +26,7 @@
<description>Spring Boot Admin</description>
<url>https://github.com/codecentric/spring-boot-admin/</url>
<properties>
<revision>2.6.3-SNAPSHOT</revision>
<revision>3.0.0-SNAPSHOT</revision>
<java.version>17</java.version>

<maven.compiler.source>${java.version}</maven.compiler.source>
Expand All @@ -36,15 +36,19 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<!-- used dependencies versions -->
<spring-boot.version>2.6.3</spring-boot.version>
<spring-cloud.version>2021.0.0</spring-cloud.version>
<spring-boot.version>3.0.0-M1</spring-boot.version>
<spring-cloud.version>2021.0.1</spring-cloud.version>
<wiremock.version>2.32.0</wiremock.version>
<hazelcast-tests.version>4.2.4</hazelcast-tests.version>
<findbugs-jsr305.version>3.0.2</findbugs-jsr305.version>
<awaitility.version>4.1.1</awaitility.version>
<testcontainers.version>1.16.3</testcontainers.version>
<jetty.version>9.4.44.v20210927</jetty.version>

<!-- Wiremock does not yet support jetty 11 (see also https://github.com/wiremock/wiremock/issues/1760).
Spring Boot 3 only supports jetty 11. -.- -->
<!--<jetty.version>11.0.6</jetty.version>-->
<junit-jupiter.version>5.8.2</junit-jupiter.version>
<jolokia.version>1.7.1</jolokia.version>

<!-- plugin versions -->
<build-helper-maven-plugin.version>3.3.0</build-helper-maven-plugin.version>
Expand Down
1 change: 1 addition & 0 deletions spring-boot-admin-client/pom.xml
Expand Up @@ -83,6 +83,7 @@
<dependency>
<groupId>com.github.tomakehurst</groupId>
<artifactId>wiremock-jre8-standalone</artifactId>
<version>${wiremock.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
Expand Down
Expand Up @@ -19,7 +19,7 @@
import java.util.Collections;
import java.util.List;

import javax.servlet.ServletContext;
import jakarta.servlet.ServletContext;

import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration;
Expand Down
Expand Up @@ -16,7 +16,7 @@

package de.codecentric.boot.admin.client.registration;

import javax.servlet.ServletContext;
import jakarta.servlet.ServletContext;

import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties;
Expand Down
Expand Up @@ -28,6 +28,7 @@
import org.springframework.web.context.ConfigurableWebApplicationContext;
import org.springframework.web.context.WebApplicationContext;

import static java.time.Duration.ZERO;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.Mockito.mock;
Expand All @@ -45,7 +46,7 @@ public void should_schedule_register_task() {
RegistrationApplicationListener listener = new RegistrationApplicationListener(registrator, scheduler);

listener.onApplicationReady(new ApplicationReadyEvent(mock(SpringApplication.class), null,
mock(ConfigurableWebApplicationContext.class)));
mock(ConfigurableWebApplicationContext.class), ZERO));

verify(scheduler).scheduleAtFixedRate(isA(Runnable.class), eq(Duration.ofSeconds(10)));
}
Expand All @@ -58,7 +59,7 @@ public void should_no_schedule_register_task_when_not_autoRegister() {
listener.setAutoRegister(false);

listener.onApplicationReady(new ApplicationReadyEvent(mock(SpringApplication.class), null,
mock(ConfigurableWebApplicationContext.class)));
mock(ConfigurableWebApplicationContext.class), ZERO));

verify(scheduler, never()).scheduleAtFixedRate(isA(Runnable.class), eq(Duration.ofSeconds(10)));
}
Expand All @@ -73,7 +74,7 @@ public void should_cancel_register_task_on_context_close() {
when(scheduler.scheduleAtFixedRate(isA(Runnable.class), eq(Duration.ofSeconds(10)))).then((invocation) -> task);

listener.onApplicationReady(new ApplicationReadyEvent(mock(SpringApplication.class), null,
mock(ConfigurableWebApplicationContext.class)));
mock(ConfigurableWebApplicationContext.class), ZERO));
verify(scheduler).scheduleAtFixedRate(isA(Runnable.class), eq(Duration.ofSeconds(10)));

listener.onClosedContext(new ContextClosedEvent(mock(WebApplicationContext.class)));
Expand Down
Expand Up @@ -47,6 +47,7 @@
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
<version>${jolokia.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down
Expand Up @@ -49,6 +49,7 @@
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
<version>${jolokia.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down
Expand Up @@ -50,6 +50,7 @@
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
<version>${jolokia.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down
4 changes: 4 additions & 0 deletions spring-boot-admin-server-ui/pom.xml
Expand Up @@ -37,6 +37,10 @@
<artifactId>spring-boot-starter-web</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
Expand Down
Expand Up @@ -36,7 +36,7 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.config.WebFluxConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.templatemode.TemplateMode;

import de.codecentric.boot.admin.server.config.AdminServerMarkerConfiguration;
Expand Down
Expand Up @@ -19,13 +19,13 @@
import java.io.IOException;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down
Expand Up @@ -16,8 +16,8 @@

package de.codecentric.boot.admin.server.ui.config;

import javax.servlet.FilterChain;
import javax.servlet.ServletResponse;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletResponse;

import org.assertj.core.api.WithAssertions;
import org.junit.jupiter.api.Nested;
Expand Down
2 changes: 2 additions & 0 deletions spring-boot-admin-server/pom.xml
Expand Up @@ -105,6 +105,7 @@
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit-jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
Expand All @@ -131,6 +132,7 @@
<dependency>
<groupId>com.github.tomakehurst</groupId>
<artifactId>wiremock-jre8</artifactId>
<version>${wiremock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
Expand Down
Expand Up @@ -47,8 +47,8 @@
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.web.client.RestTemplate;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring6.SpringTemplateEngine;
import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.templatemode.TemplateMode;

import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
Expand Down
Expand Up @@ -21,8 +21,8 @@
import java.util.HashMap;
import java.util.Map;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;

import org.jetbrains.annotations.Nullable;
import org.springframework.mail.javamail.JavaMailSender;
Expand Down
Expand Up @@ -28,7 +28,7 @@
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.actuate.endpoint.http.ActuatorMediaType;
import org.springframework.boot.actuate.endpoint.ApiVersion;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.client.ClientResponse;
import reactor.core.publisher.Mono;
Expand All @@ -46,7 +46,8 @@ public class QueryIndexEndpointStrategy implements EndpointDetectionStrategy {

private final InstanceWebClient instanceWebClient;

private static final MediaType actuatorMediaType = MediaType.parseMediaType(ActuatorMediaType.V2_JSON);
private static final MediaType actuatorMediaType = MediaType
.parseMediaType(ApiVersion.V2.getProducedMimeType().toString());

public QueryIndexEndpointStrategy(InstanceWebClient instanceWebClient) {
this.instanceWebClient = instanceWebClient;
Expand Down
Expand Up @@ -16,15 +16,15 @@

package de.codecentric.boot.admin.server.utils;

import org.springframework.boot.actuate.endpoint.http.ActuatorMediaType;
import org.springframework.boot.actuate.endpoint.ApiVersion;

public final class MediaType {

public static final org.springframework.http.MediaType ACTUATOR_V1_MEDIATYPE = org.springframework.http.MediaType
.parseMediaType("application/vnd.spring-boot.actuator.v1+json");

public static final org.springframework.http.MediaType ACTUATOR_V2_MEDIATYPE = org.springframework.http.MediaType
.parseMediaType(ActuatorMediaType.V2_JSON);
.parseMediaType(ApiVersion.V2.getProducedMimeType().toString());

private MediaType() {
}
Expand Down
Expand Up @@ -18,6 +18,7 @@

import java.io.IOException;
import java.net.URI;
import java.util.List;
import java.util.concurrent.TimeoutException;
import java.util.function.Function;

Expand All @@ -43,6 +44,10 @@
import de.codecentric.boot.admin.server.web.client.InstanceWebClient;
import de.codecentric.boot.admin.server.web.client.exception.ResolveEndpointException;

import static org.springframework.http.HttpMethod.PATCH;
import static org.springframework.http.HttpMethod.POST;
import static org.springframework.http.HttpMethod.PUT;

/**
* Forwards a request to a single instances endpoint and will respond with: - 502 (Bad
* Gateway) when any error occurs during the request - 503 (Service unavailable) when the
Expand Down Expand Up @@ -121,14 +126,7 @@ private <V> Mono<V> forward(Instance instance, ForwardRequest forwardRequest,
}

private boolean requiresBody(HttpMethod method) {
switch (method) {
case PUT:
case POST:
case PATCH:
return true;
default:
return false;
}
return List.of(PUT, POST, PATCH).contains(method);
}

@lombok.Data
Expand Down
Expand Up @@ -26,7 +26,7 @@

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.actuate.endpoint.http.ActuatorMediaType;
import org.springframework.boot.actuate.endpoint.ApiVersion;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
Expand Down Expand Up @@ -142,7 +142,7 @@ private static Boolean isLegacyResponse(ClientResponse response) {

private static ClientResponse convertLegacyResponse(LegacyEndpointConverter converter, ClientResponse response) {
return response.mutate().headers((headers) -> {
headers.replace(HttpHeaders.CONTENT_TYPE, singletonList(ActuatorMediaType.V2_JSON));
headers.replace(HttpHeaders.CONTENT_TYPE, singletonList(ApiVersion.V2.getProducedMimeType().toString()));
headers.remove(HttpHeaders.CONTENT_LENGTH);
}).body(converter::convert).build();
}
Expand Down
Expand Up @@ -21,8 +21,8 @@
import java.net.URI;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
Expand Down
Expand Up @@ -23,19 +23,19 @@
import java.util.Map;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import jakarta.activation.DataHandler;
import jakarta.mail.Message;
import jakarta.mail.MessagingException;
import jakarta.mail.Session;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeMessage;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.util.StreamUtils;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring6.SpringTemplateEngine;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import reactor.core.publisher.Mono;
Expand Down
Expand Up @@ -26,7 +26,7 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.actuate.endpoint.http.ActuatorMediaType;
import org.springframework.boot.actuate.endpoint.ApiVersion;
import org.springframework.http.MediaType;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
Expand Down Expand Up @@ -102,8 +102,9 @@ public void teardown() {
@Test
public void should_change_status_to_down() {
String body = "{ \"status\" : \"UP\", \"details\" : { \"foo\" : \"bar\" } }";
this.wireMock.stubFor(get("/health").willReturn(okForContentType(ActuatorMediaType.V2_JSON, body)
.withHeader("Content-Length", Integer.toString(body.length()))));
this.wireMock.stubFor(
get("/health").willReturn(okForContentType(ApiVersion.V2.getProducedMimeType().toString(), body)
.withHeader("Content-Length", Integer.toString(body.length()))));

StepVerifier.create(this.eventStore).expectSubscription()
.then(() -> StepVerifier.create(this.updater.updateStatus(this.instance.getId())).verifyComplete())
Expand Down

0 comments on commit 5858fa5

Please sign in to comment.