From 5aa89aadfb82893f7081c2f94e89b052a10ee8c8 Mon Sep 17 00:00:00 2001 From: Nikolaos Vastardis Date: Mon, 23 Feb 2026 14:57:18 +0000 Subject: [PATCH 1/6] Initial changes for springboot4 upgrade --- pom.xml | 59 ++++++++----------- .../vdesCtrl/components/GrAisAdvertiser.java | 5 +- .../components/Vdes1000Advertiser.java | 4 +- .../vdesCtrl/config/SpringSecurityConfig.java | 7 +-- .../grad/eNav/vdesCtrl/config/WebConfig.java | 16 ----- .../vdesCtrl/models/IJsonSerializable.java | 2 +- .../eNav/vdesCtrl/models/domain/Station.java | 5 +- .../models/dtos/S100AbstractNode.java | 5 +- .../vdesCtrl/services/StationService.java | 2 +- .../eNav/vdesCtrl/utils/AISMessageUtils.java | 12 ++-- .../eNav/vdesCtrl/utils/GeoJSONUtils.java | 8 +-- .../vdesCtrl/utils/GeometryJSONConverter.java | 12 ++-- .../utils/GeometryJSONDeserializer.java | 20 +++---- .../utils/GeometryJSONSerializer.java | 15 +++-- .../vdesCtrl/TestFeignSecurityConfig.java | 9 --- .../eNav/vdesCtrl/TestingConfiguration.java | 9 --- .../controllers/HTMLViewerControllerTest.java | 8 +-- .../controllers/StationControllerTest.java | 10 ++-- .../services/S125WebSocketServiceTest.java | 2 +- .../vdesCtrl/utils/AISMessageUtilsTest.java | 10 ++-- .../eNav/vdesCtrl/utils/GeoJSONUtilsTest.java | 6 +- .../utils/GeometryJSONConverterTest.java | 6 +- .../utils/GeometryJSONDeserializerTest.java | 10 ++-- .../utils/GeometryJSONSerializerTest.java | 12 ++-- .../eNav/vdesCtrl/utils/HeaderUtilTest.java | 20 +++---- 25 files changed, 110 insertions(+), 164 deletions(-) diff --git a/pom.xml b/pom.xml index 7b81463..17f3a66 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.springframework.boot spring-boot-starter-parent - 3.5.6 + 4.0.2 @@ -18,8 +18,8 @@ 21 - 2025.0.1 - 2.8.8 + 2025.1.1 + 3.0.1 0.1.13 3.5.4 3.1.4 @@ -67,21 +67,6 @@ true - - org.hibernate.orm.tooling - hibernate-enhance-maven-plugin - - - - true - true - - - enhance - - - - @@ -113,6 +98,13 @@ org.springframework.cloud spring-cloud-starter-netflix-eureka-client + + + + org.springframework.boot + spring-boot-jackson2 + + org.springframework.boot @@ -120,11 +112,11 @@ org.springframework.boot - spring-boot-starter-oauth2-client + spring-boot-starter-security-oauth2-client org.springframework.boot - spring-boot-starter-oauth2-resource-server + spring-boot-starter-security-oauth2-resource-server org.springframework.boot @@ -146,11 +138,6 @@ org.springframework.boot spring-boot-starter-data-jpa - - io.github.openfeign - feign-jackson - 13.6 - org.postgresql @@ -160,24 +147,24 @@ org.locationtech.jts.io jts-io-common - 1.18.1 + 1.20.0 org.projectlombok lombok - com.fasterxml.jackson.dataformat + tools.jackson.dataformat jackson-dataformat-xml - 2.13.3 + 3.0.4 - - org.springdoc - springdoc-openapi-starter-webmvc-ui - ${springdoc.version} - + + + + + @@ -192,6 +179,11 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter-webmvc-test + test + org.springframework.security spring-security-test @@ -202,7 +194,6 @@ h2 test - diff --git a/src/main/java/org/grad/eNav/vdesCtrl/components/GrAisAdvertiser.java b/src/main/java/org/grad/eNav/vdesCtrl/components/GrAisAdvertiser.java index 4ce5f0a..fd25754 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/components/GrAisAdvertiser.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/components/GrAisAdvertiser.java @@ -16,9 +16,7 @@ package org.grad.eNav.vdesCtrl.components; -import com.fasterxml.jackson.core.JsonProcessingException; import jakarta.annotation.PreDestroy; -import jakarta.xml.bind.JAXBException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Hex; import org.grad.eNav.vdesCtrl.exceptions.ValidationException; @@ -41,6 +39,7 @@ import org.springframework.context.annotation.Scope; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import tools.jackson.core.JacksonException; import java.io.IOException; import java.net.DatagramPacket; @@ -148,7 +147,7 @@ public void advertiseAtons() { try { return AISMessageUtils.s125ToAisMessage21(s125); } - catch (JsonProcessingException ex) { + catch (JacksonException ex) { log.error(ex.getMessage()); return null; } diff --git a/src/main/java/org/grad/eNav/vdesCtrl/components/Vdes1000Advertiser.java b/src/main/java/org/grad/eNav/vdesCtrl/components/Vdes1000Advertiser.java index c38e10f..95f496a 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/components/Vdes1000Advertiser.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/components/Vdes1000Advertiser.java @@ -16,7 +16,6 @@ package org.grad.eNav.vdesCtrl.components; -import com.fasterxml.jackson.core.JsonProcessingException; import com.nimbusds.jose.util.Base64; import jakarta.annotation.PreDestroy; import lombok.extern.slf4j.Slf4j; @@ -52,6 +51,7 @@ import org.springframework.messaging.MessageHeaders; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import tools.jackson.core.JacksonException; import java.io.IOException; import java.net.*; @@ -198,7 +198,7 @@ public void advertiseAtons() { try { return AISMessageUtils.s125ToAisMessage21(s125); } - catch (JsonProcessingException ex) { + catch (JacksonException ex) { log.error(ex.getMessage()); return null; } diff --git a/src/main/java/org/grad/eNav/vdesCtrl/config/SpringSecurityConfig.java b/src/main/java/org/grad/eNav/vdesCtrl/config/SpringSecurityConfig.java index c629eec..bdbe593 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/config/SpringSecurityConfig.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/config/SpringSecurityConfig.java @@ -21,10 +21,9 @@ import org.grad.eNav.vdesCtrl.config.keycloak.KeycloakJwtAuthenticationConverter; import org.grad.eNav.vdesCtrl.config.keycloak.KeycloakLogoutHandler; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest; -import org.springframework.boot.actuate.health.HealthEndpoint; import org.springframework.boot.actuate.info.InfoEndpoint; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.health.actuate.endpoint.HealthEndpoint; +import org.springframework.boot.security.autoconfigure.actuate.web.servlet.EndpointRequest; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -39,7 +38,6 @@ import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper; import org.springframework.security.core.session.SessionRegistryImpl; -import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.core.user.OAuth2UserAuthority; import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.security.web.SecurityFilterChain; @@ -47,7 +45,6 @@ import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy; import org.springframework.security.web.firewall.HttpFirewall; import org.springframework.security.web.firewall.StrictHttpFirewall; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.web.client.RestTemplate; import org.springframework.web.filter.ForwardedHeaderFilter; diff --git a/src/main/java/org/grad/eNav/vdesCtrl/config/WebConfig.java b/src/main/java/org/grad/eNav/vdesCtrl/config/WebConfig.java index e047da9..46bfa68 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/config/WebConfig.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/config/WebConfig.java @@ -29,22 +29,6 @@ @Configuration public class WebConfig implements WebMvcConfigurer { - /** - * As of Spring Framework 6.0, the trailing slash matching configuration - * option has been deprecated and its default value set to false. This - * means that previously, the following controller would match both - * "GET /some/greeting" and "GET /some/greeting/". To disable this - * functionality and mirror the previous version behaviour we need to - * do this. Note that this functionality has been deprecated so we need - * to be careful. - * - * @param pathMatchConfigurer the path match configurer - */ - @Override - public void configurePathMatch(PathMatchConfigurer pathMatchConfigurer) { - pathMatchConfigurer.setUseTrailingSlashMatch(true); - } - /** * Add the static resources and webjars to the web resources. * diff --git a/src/main/java/org/grad/eNav/vdesCtrl/models/IJsonSerializable.java b/src/main/java/org/grad/eNav/vdesCtrl/models/IJsonSerializable.java index ff3af7d..4a05e01 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/models/IJsonSerializable.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/models/IJsonSerializable.java @@ -18,7 +18,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.annotation.JsonSerialize; /** * Should be implemented by value objects that will be serialized as JSON. diff --git a/src/main/java/org/grad/eNav/vdesCtrl/models/domain/Station.java b/src/main/java/org/grad/eNav/vdesCtrl/models/domain/Station.java index 050a8cc..ac057b3 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/models/domain/Station.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/models/domain/Station.java @@ -16,15 +16,14 @@ package org.grad.eNav.vdesCtrl.models.domain; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; import jakarta.validation.constraints.NotNull; import org.grad.eNav.vdesCtrl.utils.GeometryJSONDeserializer; import org.grad.eNav.vdesCtrl.utils.GeometryJSONSerializer; import org.grad.vdes1000.formats.generic.AISChannelPref; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; -import org.hibernate.annotations.ColumnDefault; import org.locationtech.jts.geom.Geometry; import jakarta.persistence.*; diff --git a/src/main/java/org/grad/eNav/vdesCtrl/models/dtos/S100AbstractNode.java b/src/main/java/org/grad/eNav/vdesCtrl/models/dtos/S100AbstractNode.java index 11ebc71..6296750 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/models/dtos/S100AbstractNode.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/models/dtos/S100AbstractNode.java @@ -16,9 +16,8 @@ package org.grad.eNav.vdesCtrl.models.dtos; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import tools.jackson.databind.annotation.JsonDeserialize; +import tools.jackson.databind.annotation.JsonSerialize; import org.grad.eNav.vdesCtrl.models.IJsonSerializable; import org.grad.eNav.vdesCtrl.utils.GeometryJSONDeserializer; import org.grad.eNav.vdesCtrl.utils.GeometryJSONSerializer; diff --git a/src/main/java/org/grad/eNav/vdesCtrl/services/StationService.java b/src/main/java/org/grad/eNav/vdesCtrl/services/StationService.java index 0c6a167..0fa2874 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/services/StationService.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/services/StationService.java @@ -16,7 +16,7 @@ package org.grad.eNav.vdesCtrl.services; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; diff --git a/src/main/java/org/grad/eNav/vdesCtrl/utils/AISMessageUtils.java b/src/main/java/org/grad/eNav/vdesCtrl/utils/AISMessageUtils.java index 3de9a1f..6f12333 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/utils/AISMessageUtils.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/utils/AISMessageUtils.java @@ -16,10 +16,8 @@ package org.grad.eNav.vdesCtrl.utils; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.dataformat.xml.XmlMapper; -import jakarta.xml.bind.JAXBException; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; import lombok.extern.slf4j.Slf4j; import org.grad.eNav.vdesCtrl.models.dtos.FeatureNameDto; import org.grad.eNav.vdesCtrl.models.dtos.S100AbstractNode; @@ -27,6 +25,7 @@ import org.grad.vdes1000.formats.ais.messages.AISMessage21; import org.grad.vdes1000.formats.generic.AtonType; import org.locationtech.jts.geom.*; +import tools.jackson.dataformat.xml.XmlMapper; import java.math.BigInteger; import java.time.LocalDateTime; @@ -47,9 +46,8 @@ public class AISMessageUtils { * Constructors from an S125Node object. * * @param s125Node the S125Node object - * @throws JAXBException when the S125Node XML content cannot be parsed */ - public static AISMessage21 s125ToAisMessage21(S125Node s125Node) throws JsonProcessingException { + public static AISMessage21 s125ToAisMessage21(S125Node s125Node) throws JacksonException { // Default at first final AISMessage21 aisMessage21 = new AISMessage21(); @@ -60,7 +58,7 @@ public static AISMessage21 s125ToAisMessage21(S125Node s125Node) throws JsonProc // JSON and try to pick the minimal fields we are interested in. // // ===================================================================// final JsonNode datasetNode = new XmlMapper().readTree(s125Node.getContent()); - final Iterator> datasetMembers = datasetNode.get("members").fields(); + final Iterator> datasetMembers = datasetNode.get("members").properties().iterator(); // ===================================================================// String atonNodeType; diff --git a/src/main/java/org/grad/eNav/vdesCtrl/utils/GeoJSONUtils.java b/src/main/java/org/grad/eNav/vdesCtrl/utils/GeoJSONUtils.java index bfeeb5b..1543881 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/utils/GeoJSONUtils.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/utils/GeoJSONUtils.java @@ -16,12 +16,12 @@ package org.grad.eNav.vdesCtrl.utils; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import org.locationtech.jts.geom.*; import org.locationtech.jts.io.geojson.GeoJsonWriter; -import java.io.IOException; import java.util.Objects; import java.util.Optional; @@ -67,7 +67,7 @@ public static JsonNode createGeoJSONPoint(double x, double y, Integer srid) { ObjectMapper om = new ObjectMapper(); try { return om.readTree(new GeoJsonWriter().write(point)); - } catch (IOException e) { + } catch (JacksonException e) { return null; } } diff --git a/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONConverter.java b/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONConverter.java index 8e4ecbc..0841a83 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONConverter.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONConverter.java @@ -16,8 +16,9 @@ package org.grad.eNav.vdesCtrl.utils; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.io.ParseException; import org.locationtech.jts.io.geojson.GeoJsonReader; @@ -45,9 +46,8 @@ public static JsonNode convertFromGeometry(Geometry geometry) { ObjectMapper om = new ObjectMapper(); try { - JsonNode node = om.readTree(new GeoJsonWriter().write(geometry)); - return node; - } catch (IOException e) { + return om.readTree(new GeoJsonWriter().write(geometry)); + } catch (JacksonException e) { return null; } } @@ -59,7 +59,7 @@ public static JsonNode convertFromGeometry(Geometry geometry) { * @return the geometry */ public static Geometry convertToGeometry(JsonNode jsonNode) { - if (jsonNode == null || jsonNode.toString() == "null" || jsonNode.asText() == "null") { + if (jsonNode == null || jsonNode.toString() == "null") { return null; } diff --git a/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONDeserializer.java b/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONDeserializer.java index 0e42f00..50375b4 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONDeserializer.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONDeserializer.java @@ -16,28 +16,24 @@ package org.grad.eNav.vdesCtrl.utils; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.JsonNode; import org.locationtech.jts.geom.Geometry; - -import java.io.IOException; +import tools.jackson.databind.ValueDeserializer; /** * The type Geometry json deserializer. * * @author Nikolaos Vastardis (email: Nikolaos.Vastardis@gla-rad.org) */ -public class GeometryJSONDeserializer extends JsonDeserializer { +public class GeometryJSONDeserializer extends ValueDeserializer { @Override public Geometry deserialize(JsonParser jsonParser, - DeserializationContext deserializationContext) throws IOException { - ObjectMapper mapper = new ObjectMapper(); - JsonNode node = mapper.readTree(jsonParser); + DeserializationContext deserializationContext) throws JacksonException { + JsonNode node = deserializationContext.readTree(jsonParser); return GeometryJSONConverter.convertToGeometry(node); } diff --git a/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONSerializer.java b/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONSerializer.java index 00d4e58..4a982a8 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONSerializer.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONSerializer.java @@ -16,23 +16,22 @@ package org.grad.eNav.vdesCtrl.utils; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; import org.locationtech.jts.geom.Geometry; - -import java.io.IOException; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; /** * The type Geometry json serializer. */ -public class GeometryJSONSerializer extends JsonSerializer { +public class GeometryJSONSerializer extends ValueSerializer { @Override public void serialize(Geometry geometry, JsonGenerator jsonGenerator, - SerializerProvider serializerProvider) throws IOException { - jsonGenerator.writeObject(GeometryJSONConverter.convertFromGeometry(geometry)); + SerializationContext serializationContext) throws JacksonException { + jsonGenerator.writeTree(GeometryJSONConverter.convertFromGeometry(geometry)); } } diff --git a/src/test/java/org/grad/eNav/vdesCtrl/TestFeignSecurityConfig.java b/src/test/java/org/grad/eNav/vdesCtrl/TestFeignSecurityConfig.java index 74fd049..5c17ca0 100644 --- a/src/test/java/org/grad/eNav/vdesCtrl/TestFeignSecurityConfig.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/TestFeignSecurityConfig.java @@ -31,14 +31,5 @@ @TestConfiguration public class TestFeignSecurityConfig { - /** - * The HTTP Security mock. - * - * @return the HTTP security mock - */ - @Bean - HttpSecurity httpSecurity() { - return mock(HttpSecurity.class); - } } diff --git a/src/test/java/org/grad/eNav/vdesCtrl/TestingConfiguration.java b/src/test/java/org/grad/eNav/vdesCtrl/TestingConfiguration.java index b6ce2e9..6f1df57 100755 --- a/src/test/java/org/grad/eNav/vdesCtrl/TestingConfiguration.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/TestingConfiguration.java @@ -31,13 +31,4 @@ @TestConfiguration public class TestingConfiguration { - /** - * The registration listener for feign registers the client inside a - * client repository which is also needed, hence mocked. - */ - @Bean - public ClientRegistrationRepository clientRegistrationRepository() { - return mock(ClientRegistrationRepository.class); - } - } diff --git a/src/test/java/org/grad/eNav/vdesCtrl/controllers/HTMLViewerControllerTest.java b/src/test/java/org/grad/eNav/vdesCtrl/controllers/HTMLViewerControllerTest.java index d75c7ea..2f99639 100644 --- a/src/test/java/org/grad/eNav/vdesCtrl/controllers/HTMLViewerControllerTest.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/controllers/HTMLViewerControllerTest.java @@ -28,11 +28,11 @@ import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.PrecisionModel; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.security.autoconfigure.SecurityAutoConfiguration; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.http.MediaType; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; import java.math.BigInteger; @@ -56,7 +56,7 @@ class HTMLViewerControllerTest { /** * The Station Service mock. */ - @MockBean + @MockitoBean StationService stationService; // Test Variables diff --git a/src/test/java/org/grad/eNav/vdesCtrl/controllers/StationControllerTest.java b/src/test/java/org/grad/eNav/vdesCtrl/controllers/StationControllerTest.java index 76b6857..8cbea06 100644 --- a/src/test/java/org/grad/eNav/vdesCtrl/controllers/StationControllerTest.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/controllers/StationControllerTest.java @@ -16,7 +16,7 @@ package org.grad.eNav.vdesCtrl.controllers; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import org.grad.eNav.vdesCtrl.TestFeignSecurityConfig; import org.grad.eNav.vdesCtrl.TestingConfiguration; import org.grad.eNav.vdesCtrl.exceptions.DataNotFoundException; @@ -35,15 +35,15 @@ import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.PrecisionModel; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.security.autoconfigure.SecurityAutoConfiguration; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.http.MediaType; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; @@ -79,7 +79,7 @@ class StationControllerTest { /** * The Station Service mock. */ - @MockBean + @MockitoBean StationService stationService; // Test Variables diff --git a/src/test/java/org/grad/eNav/vdesCtrl/services/S125WebSocketServiceTest.java b/src/test/java/org/grad/eNav/vdesCtrl/services/S125WebSocketServiceTest.java index 185c78a..b1c4821 100644 --- a/src/test/java/org/grad/eNav/vdesCtrl/services/S125WebSocketServiceTest.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/services/S125WebSocketServiceTest.java @@ -16,7 +16,7 @@ package org.grad.eNav.vdesCtrl.services; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.grad.eNav.vdesCtrl.models.PubSubMsgHeaders; import org.grad.eNav.vdesCtrl.models.domain.StationType; import org.grad.eNav.vdesCtrl.models.dtos.S125Node; diff --git a/src/test/java/org/grad/eNav/vdesCtrl/utils/AISMessageUtilsTest.java b/src/test/java/org/grad/eNav/vdesCtrl/utils/AISMessageUtilsTest.java index afacfb8..ac1951f 100644 --- a/src/test/java/org/grad/eNav/vdesCtrl/utils/AISMessageUtilsTest.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/utils/AISMessageUtilsTest.java @@ -16,7 +16,7 @@ package org.grad.eNav.vdesCtrl.utils; -import com.fasterxml.jackson.core.JsonProcessingException; +import tools.jackson.core.JacksonException; import org.grad.eNav.vdesCtrl.models.dtos.FeatureNameDto; import org.grad.eNav.vdesCtrl.models.dtos.S125Node; import org.grad.vdes1000.formats.ais.messages.AISMessage21; @@ -75,7 +75,7 @@ public void testEmptyConstructor() { * correctly picked up, for a test Virtual AtoN. */ @Test - public void testS125NodeConstructorNo1() throws JsonProcessingException { + public void testS125NodeConstructorNo1() throws JacksonException { // Create an S125Node message S125Node node = new S125Node("aton.uk.test_aton_no_1", null, S125_NO_1_CONTENT); FeatureNameDto featureNameDto = new FeatureNameDto(); @@ -105,7 +105,7 @@ public void testS125NodeConstructorNo1() throws JsonProcessingException { * correctly picked up, for a different Virtual AtoN. */ @Test - public void testS125NodeConstructorNo2() throws JsonProcessingException { + public void testS125NodeConstructorNo2() throws JacksonException { // Create an S125Node message S125Node node = new S125Node("aton.uk.test_aton_no_2", null, S125_NO_2_CONTENT); FeatureNameDto featureNameDto = new FeatureNameDto(); @@ -135,7 +135,7 @@ public void testS125NodeConstructorNo2() throws JsonProcessingException { * correctly picked up, for a real AtoN. */ @Test - public void testS125NodeConstructorNo3() throws JsonProcessingException { + public void testS125NodeConstructorNo3() throws JacksonException { // Create an S125Node message S125Node node = new S125Node("aton.uk.test_aton_no_3", null, S125_NO_3_CONTENT); FeatureNameDto featureNameDto = new FeatureNameDto(); @@ -170,7 +170,7 @@ public void testS125NodeConstructorFails() { S125Node node = new S125Node("aton.uk.test_aton_no_1", null, "Erroneous Content"); // Create the GR-AIS Message 21 Parameters and see it fail - assertThrows(JsonProcessingException.class, () -> AISMessageUtils.s125ToAisMessage21(node)); + assertThrows(JacksonException.class, () -> AISMessageUtils.s125ToAisMessage21(node)); } } \ No newline at end of file diff --git a/src/test/java/org/grad/eNav/vdesCtrl/utils/GeoJSONUtilsTest.java b/src/test/java/org/grad/eNav/vdesCtrl/utils/GeoJSONUtilsTest.java index 9955755..051f7d9 100644 --- a/src/test/java/org/grad/eNav/vdesCtrl/utils/GeoJSONUtilsTest.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/utils/GeoJSONUtilsTest.java @@ -16,9 +16,9 @@ package org.grad.eNav.vdesCtrl.utils; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONConverterTest.java b/src/test/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONConverterTest.java index ac11728..4b00509 100644 --- a/src/test/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONConverterTest.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONConverterTest.java @@ -16,9 +16,9 @@ package org.grad.eNav.vdesCtrl.utils; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.locationtech.jts.geom.Coordinate; diff --git a/src/test/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONDeserializerTest.java b/src/test/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONDeserializerTest.java index eeb6c9e..fc853e2 100644 --- a/src/test/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONDeserializerTest.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONDeserializerTest.java @@ -16,9 +16,9 @@ package org.grad.eNav.vdesCtrl.utils; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.locationtech.jts.geom.Coordinate; @@ -71,7 +71,7 @@ void setUp() { void testDeserialize() throws IOException { Geometry result = this.deserializer.deserialize( this.objectMapper.createParser(this.jsonNode.toString()), - this.objectMapper.getDeserializationContext()); + this.objectMapper._deserializationContext()); assertEquals(this.geometry, result); } @@ -84,7 +84,7 @@ void testDeserialize() throws IOException { void testDeserializeError() throws IOException { Geometry result = this.deserializer.deserialize( this.objectMapper.createParser("{\"param\":\"value\"}"), - this.objectMapper.getDeserializationContext()); + this.objectMapper._deserializationContext()); assertNull(result); } diff --git a/src/test/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONSerializerTest.java b/src/test/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONSerializerTest.java index af54390..bb38b5e 100644 --- a/src/test/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONSerializerTest.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONSerializerTest.java @@ -16,8 +16,9 @@ package org.grad.eNav.vdesCtrl.utils; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.locationtech.jts.geom.Coordinate; @@ -60,9 +61,10 @@ void setUp() { */ @Test void testSerialize() throws IOException { - ByteArrayOutputStream os = new ByteArrayOutputStream(); - JsonGenerator jsonGenerator = this.objectMapper.createGenerator(os); - this.serializer.serialize(this.geometry, jsonGenerator, this.objectMapper.getSerializerProvider()); + final ByteArrayOutputStream os = new ByteArrayOutputStream(); + try (JsonGenerator jsonGenerator = this.objectMapper.createGenerator(os)) { + this.serializer.serialize(this.geometry, jsonGenerator, this.objectMapper._serializationContext()); + } assertEquals(this.json, os.toString("UTF-8")); } diff --git a/src/test/java/org/grad/eNav/vdesCtrl/utils/HeaderUtilTest.java b/src/test/java/org/grad/eNav/vdesCtrl/utils/HeaderUtilTest.java index 2939126..5944029 100644 --- a/src/test/java/org/grad/eNav/vdesCtrl/utils/HeaderUtilTest.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/utils/HeaderUtilTest.java @@ -31,9 +31,9 @@ class HeaderUtilTest { void testCreateAlert() { HttpHeaders headers = HeaderUtil.createAlert("message", "param"); assertNotNull(headers); - assertTrue(headers.containsKey("X-vdesCtrl-alert")); + assertTrue(headers.containsHeader("X-vdesCtrl-alert")); assertEquals("[message]", headers.get("X-vdesCtrl-alert").toString()); - assertTrue(headers.containsKey("X-vdesCtrl-params")); + assertTrue(headers.containsHeader("X-vdesCtrl-params")); assertEquals("[param]", headers.get("X-vdesCtrl-params").toString()); } @@ -44,8 +44,8 @@ void testCreateAlert() { void testCreateEntityCreationAlert() { HttpHeaders headers = HeaderUtil.createEntityCreationAlert("entity", "param"); assertNotNull(headers); - assertTrue(headers.containsKey("X-vdesCtrl-alert")); - assertTrue(headers.containsKey("X-vdesCtrl-params")); + assertTrue(headers.containsHeader("X-vdesCtrl-alert")); + assertTrue(headers.containsHeader("X-vdesCtrl-params")); assertEquals("[param]", headers.get("X-vdesCtrl-params").toString()); } @@ -56,8 +56,8 @@ void testCreateEntityCreationAlert() { void testCreateEntityUpdateAlert() { HttpHeaders headers = HeaderUtil.createEntityUpdateAlert("entity", "param"); assertNotNull(headers); - assertTrue(headers.containsKey("X-vdesCtrl-alert")); - assertTrue(headers.containsKey("X-vdesCtrl-params")); + assertTrue(headers.containsHeader("X-vdesCtrl-alert")); + assertTrue(headers.containsHeader("X-vdesCtrl-params")); assertEquals("[param]", headers.get("X-vdesCtrl-params").toString()); } @@ -68,8 +68,8 @@ void testCreateEntityUpdateAlert() { void testCreateEntityDeletionAlert() { HttpHeaders headers = HeaderUtil.createEntityDeletionAlert("entity", "param"); assertNotNull(headers); - assertTrue(headers.containsKey("X-vdesCtrl-alert")); - assertTrue(headers.containsKey("X-vdesCtrl-params")); + assertTrue(headers.containsHeader("X-vdesCtrl-alert")); + assertTrue(headers.containsHeader("X-vdesCtrl-params")); assertEquals("[param]", headers.get("X-vdesCtrl-params").toString()); } @@ -80,9 +80,9 @@ void testCreateEntityDeletionAlert() { void testCreateFailureAlert() { HttpHeaders headers = HeaderUtil.createFailureAlert("entity", "key", "message"); assertNotNull(headers); - assertTrue(headers.containsKey("X-vdesCtrl-error")); + assertTrue(headers.containsHeader("X-vdesCtrl-error")); assertEquals("[error.key]", headers.get("X-vdesCtrl-error").toString()); - assertTrue(headers.containsKey("X-vdesCtrl-params")); + assertTrue(headers.containsHeader("X-vdesCtrl-params")); assertEquals("[entity]", headers.get("X-vdesCtrl-params").toString()); } From a4eabcbaee7d8b9f32235521e1cbd920db041e86 Mon Sep 17 00:00:00 2001 From: Nikolaos Vastardis Date: Mon, 23 Feb 2026 16:32:29 +0000 Subject: [PATCH 2/6] Minor updates to the upgrade --- pom.xml | 10 +++++----- .../controllers/HTMLViewerController.java | 1 - .../vdesCtrl/utils/GeometryJSONConverter.java | 2 -- .../eNav/vdesCtrl/TestingConfiguration.java | 18 ++++++++++++++++++ 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 17f3a66..fdf9351 100644 --- a/pom.xml +++ b/pom.xml @@ -160,11 +160,11 @@ - - - - - + + org.springdoc + springdoc-openapi-starter-webmvc-ui + ${springdoc.version} + diff --git a/src/main/java/org/grad/eNav/vdesCtrl/controllers/HTMLViewerController.java b/src/main/java/org/grad/eNav/vdesCtrl/controllers/HTMLViewerController.java index f3ddbe8..697464f 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/controllers/HTMLViewerController.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/controllers/HTMLViewerController.java @@ -26,7 +26,6 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; -import java.util.stream.Collectors; /** * The Home Viewer Controller. diff --git a/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONConverter.java b/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONConverter.java index 0841a83..5830f29 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONConverter.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/utils/GeometryJSONConverter.java @@ -24,8 +24,6 @@ import org.locationtech.jts.io.geojson.GeoJsonReader; import org.locationtech.jts.io.geojson.GeoJsonWriter; -import java.io.IOException; - /** * The type Geometry JSON converter. * diff --git a/src/test/java/org/grad/eNav/vdesCtrl/TestingConfiguration.java b/src/test/java/org/grad/eNav/vdesCtrl/TestingConfiguration.java index 6f1df57..ab59e3f 100755 --- a/src/test/java/org/grad/eNav/vdesCtrl/TestingConfiguration.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/TestingConfiguration.java @@ -17,6 +17,8 @@ package org.grad.eNav.vdesCtrl; import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.cloud.openfeign.support.PageJacksonModule; +import org.springframework.cloud.openfeign.support.SortJacksonModule; import org.springframework.context.annotation.Bean; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; @@ -31,4 +33,20 @@ @TestConfiguration public class TestingConfiguration { + /** + * Support for Jackson Page Deserialization. + */ + @Bean + public PageJacksonModule pageJacksonModule() { + return new PageJacksonModule(); + } + + /** + * Support for Jackson Page Sorting Deserialization. + */ + @Bean + public SortJacksonModule sortJacksonModule() { + return new SortJacksonModule(); + } + } From 86d2cc96fcac1f84c87e7f889254fd7ec00792b7 Mon Sep 17 00:00:00 2001 From: Nikolaos Vastardis Date: Fri, 1 May 2026 09:47:11 +0100 Subject: [PATCH 3/6] Upgrading to JDK25 and bringing in line with other SB4 upgrades --- .github/workflows/maven.yml | 4 +- README.md | 2 +- docker/Dockerfile | 8 +- pom.xml | 197 ++++++++++++------ .../eNav/vdesCtrl/models/dtos/S124Node.java | 1 - src/main/resources/application.properties | 2 +- src/main/resources/vdesController.conf | 2 +- .../eNav/vdesCtrl/TestingConfiguration.java | 16 -- .../eNav/vdesCtrl/VDESControllerTest.java | 2 +- src/test/resources/application.properties | 1 - 10 files changed, 142 insertions(+), 93 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 4d48e60..7f13190 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -16,10 +16,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 21 + - name: Set up JDK 25 uses: actions/setup-java@v3 with: - java-version: '21' + java-version: '25' distribution: 'temurin' cache: maven - name: Build with Maven diff --git a/README.md b/README.md index 8e9d7b4..d4a17f0 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ update the *.gitignore* file appropriately. ## Build Setup -The project is using the latest OpenJDK 21 to build, although earlier versions +The project is using the latest OpenJDK 25 to build, although earlier versions should also work. To build the project you will need Maven, which usually comes along-side the diff --git a/docker/Dockerfile b/docker/Dockerfile index fbc3154..97c69d8 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -14,8 +14,8 @@ # the conf-folder and point to them in application.properties. # -# Use the official OpenJDK 21 image as the base image -FROM eclipse-temurin:21-jre-alpine +# Use the official OpenJDK 25 image as the base image +FROM eclipse-temurin:25-jre-alpine LABEL org.opencontainers.image.source="https://github.com/gla-rad/eNav-VDESController" @@ -23,7 +23,7 @@ LABEL org.opencontainers.image.source="https://github.com/gla-rad/eNav-VDESContr WORKDIR /app # Copy the Spring Boot JAR file into the container -COPY target/vdes-controller-0.0.5-SNAPSHOT.jar . +COPY target/vdes-controller-0.0.6-SNAPSHOT.jar . # Create a modules path just in case ENV LOADER_PATH /modules @@ -37,4 +37,4 @@ ENV CONFIG_DIR=/conf EXPOSE 8762 -CMD ["java", "-jar", "vdes-controller-0.0.5-SNAPSHOT.jar", "--spring.config.location=optional:classpath:/,optional:file:${CONFIG_DIR}/"] +CMD ["java", "-jar", "vdes-controller-0.0.6-SNAPSHOT.jar", "--spring.config.location=optional:classpath:/,optional:file:${CONFIG_DIR}/"] diff --git a/pom.xml b/pom.xml index fdf9351..861777e 100644 --- a/pom.xml +++ b/pom.xml @@ -6,18 +6,44 @@ org.springframework.boot spring-boot-starter-parent - 4.0.2 + 4.0.5 org.grad vdes-controller - 0.0.5-SNAPSHOT + 0.0.6-SNAPSHOT VDESController GRAD e-Navigation VDES Controller Microservice + + + Apache-2.0 + https://www.apache.org/licenses/LICENSE-2.0.txt + repo + Free license to use with acknowledgement to GRAD. + + + + + nvasta + Nikolaos Vastardis + Nikolaos.Vastardis@gla-rad.org + https://www.gla-rad.org/sectors/digital-services + GRAD + https://www.gla-rad.org/ + + + l0rro + Lawrence Hughes + Lawrence.Hughes@gla-rad.org + https://www.gla-rad.org/sectors/digital-services + GRAD + https://www.gla-rad.org/ + + - 21 + 25 2025.1.1 3.0.1 0.1.13 @@ -26,6 +52,14 @@ + + + false + + maven-central + Maven Apache Repository + https://repo.maven.apache.org/maven2 + grad https://rnavlab.gla-rad.org/mvn/repository/grad/ @@ -41,70 +75,76 @@ org.apache.maven.plugins maven-surefire-plugin - ${maven-surefire-plugin.version} - -javaagent:${settings.localRepository}/org/mockito/mockito-core/${mockito.version}/mockito-core-${mockito.version}.jar + + -javaagent:${settings.localRepository}/org/mockito/mockito-core/${mockito.version}/mockito-core-${mockito.version}.jar + -Xshare:off + - - org.apache.maven.plugins - maven-deploy-plugin - ${maven-deploy-plugin.version} - org.springframework.boot spring-boot-maven-plugin - true + + + org.projectlombok + lombok + + - org.graalvm.buildtools - native-maven-plugin - - -march=compatibility - - true - + org.apache.maven.plugins + maven-compiler-plugin + + + default-compile + compile + + compile + + + + + org.projectlombok + lombok + + + + + + default-testCompile + test-compile + + testCompile + + + + + org.projectlombok + lombok + + + + + - - org.springframework.cloud - spring-cloud-starter - - - org.springframework.cloud - spring-cloud-starter-config - org.springframework.boot - spring-boot-starter-web + spring-boot-starter-actuator org.springframework.boot - spring-boot-starter-validation + spring-boot-starter-data-jpa org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - org.springframework.cloud - spring-cloud-starter-netflix-eureka-client - - - - org.springframework.boot - spring-boot-jackson2 - - + spring-boot-starter-integration org.springframework.boot @@ -123,20 +163,32 @@ spring-boot-starter-thymeleaf - org.thymeleaf.extras - thymeleaf-extras-springsecurity6 + org.springframework.boot + spring-boot-starter-validation - org.springframework.integration - spring-integration-core + org.springframework.boot + spring-boot-starter-webmvc org.springframework.boot spring-boot-starter-websocket - org.springframework.boot - spring-boot-starter-data-jpa + org.springframework.cloud + spring-cloud-starter-config + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity6 @@ -144,15 +196,16 @@ postgresql runtime + + org.projectlombok + lombok + true + org.locationtech.jts.io jts-io-common 1.20.0 - - org.projectlombok - lombok - tools.jackson.dataformat jackson-dataformat-xml @@ -176,17 +229,38 @@ org.springframework.boot - spring-boot-starter-test + spring-boot-devtools + runtime + true + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-actuator-test test org.springframework.boot - spring-boot-starter-webmvc-test + spring-boot-starter-thymeleaf-test test - org.springframework.security - spring-security-test + org.springframework.boot + spring-boot-starter-validation-test + test + + + org.springframework.boot + spring-boot-starter-websocket-test + test + + + org.springframework.integration + spring-integration-test test @@ -199,13 +273,6 @@ - - org.springframework.boot - spring-boot-devtools - runtime - true - - org.springframework.cloud spring-cloud-dependencies diff --git a/src/main/java/org/grad/eNav/vdesCtrl/models/dtos/S124Node.java b/src/main/java/org/grad/eNav/vdesCtrl/models/dtos/S124Node.java index 6982179..25632d5 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/models/dtos/S124Node.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/models/dtos/S124Node.java @@ -16,7 +16,6 @@ package org.grad.eNav.vdesCtrl.models.dtos; -import com.fasterxml.jackson.databind.JsonNode; import org.locationtech.jts.geom.Geometry; import java.util.Objects; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6ad08b6..9447667 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,6 +1,6 @@ server.port=8762 spring.application.name=vdes-ctrl -spring.application.version=0.0.5 +spring.application.version=0.0.6 # The Spring Cloud Discovery Config spring.config.import=optional:configserver:${ENAV_CLOUD_CONFIG_URI} diff --git a/src/main/resources/vdesController.conf b/src/main/resources/vdesController.conf index 5ac3f88..8700ab7 100644 --- a/src/main/resources/vdesController.conf +++ b/src/main/resources/vdesController.conf @@ -1,2 +1,2 @@ -JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/ +JAVA_HOME=/usr/lib/jvm/java-25-openjdk-amd64/ JAVA_OPTS=-Xmx1024M \ No newline at end of file diff --git a/src/test/java/org/grad/eNav/vdesCtrl/TestingConfiguration.java b/src/test/java/org/grad/eNav/vdesCtrl/TestingConfiguration.java index ab59e3f..0dfa895 100755 --- a/src/test/java/org/grad/eNav/vdesCtrl/TestingConfiguration.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/TestingConfiguration.java @@ -33,20 +33,4 @@ @TestConfiguration public class TestingConfiguration { - /** - * Support for Jackson Page Deserialization. - */ - @Bean - public PageJacksonModule pageJacksonModule() { - return new PageJacksonModule(); - } - - /** - * Support for Jackson Page Sorting Deserialization. - */ - @Bean - public SortJacksonModule sortJacksonModule() { - return new SortJacksonModule(); - } - } diff --git a/src/test/java/org/grad/eNav/vdesCtrl/VDESControllerTest.java b/src/test/java/org/grad/eNav/vdesCtrl/VDESControllerTest.java index a21f194..1e4411e 100644 --- a/src/test/java/org/grad/eNav/vdesCtrl/VDESControllerTest.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/VDESControllerTest.java @@ -21,7 +21,7 @@ import org.springframework.context.annotation.Import; import org.springframework.test.context.TestPropertySource; -@SpringBootTest +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @TestPropertySource("classpath:application.properties") @Import(TestingConfiguration.class) class VDESControllerTest { diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 4455ce1..a183997 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -4,7 +4,6 @@ spring.application.name=vdes-ctrl spring.cloud.config.enabled=false # Disable Security while testing -app.security.basic.enabled=false keycloak.enabled=false # Disable Eureka when testing From 34f5ff28da4221d1b871b06d4ea2dc620e9660b7 Mon Sep 17 00:00:00 2001 From: Nikolaos Vastardis Date: Fri, 1 May 2026 09:52:39 +0100 Subject: [PATCH 4/6] Adding feign urls, commented out, for testing --- .../java/org/grad/eNav/vdesCtrl/feign/AtonServiceClient.java | 2 +- src/main/java/org/grad/eNav/vdesCtrl/feign/CKeeperClient.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/grad/eNav/vdesCtrl/feign/AtonServiceClient.java b/src/main/java/org/grad/eNav/vdesCtrl/feign/AtonServiceClient.java index 76141bf..01fc36b 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/feign/AtonServiceClient.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/feign/AtonServiceClient.java @@ -32,7 +32,7 @@ * @author Nikolaos Vastardis (email: Nikolaos.Vastardis@gla-rad.org) */ @Component -@FeignClient(name = "aton-service", configuration = FeignClientConfig.class) +@FeignClient(/*url = "https://rnavlab.gla-rad.org/enav/aton-service",*/ name = "aton-service", configuration = FeignClientConfig.class) public interface AtonServiceClient { @RequestMapping(method = RequestMethod.GET, value = "/api/atons/list") diff --git a/src/main/java/org/grad/eNav/vdesCtrl/feign/CKeeperClient.java b/src/main/java/org/grad/eNav/vdesCtrl/feign/CKeeperClient.java index 5e88713..5885c17 100644 --- a/src/main/java/org/grad/eNav/vdesCtrl/feign/CKeeperClient.java +++ b/src/main/java/org/grad/eNav/vdesCtrl/feign/CKeeperClient.java @@ -29,7 +29,7 @@ * @author Nikolaos Vastardis (email: Nikolaos.Vastardis@gla-rad.org) */ @Component -@FeignClient(name = "ckeeper", configuration = FeignClientConfig.class) +@FeignClient(/*url = "https://rnavlab.gla-rad.org/enav/ckeeper",*/ name = "ckeeper", configuration = FeignClientConfig.class) public interface CKeeperClient { @RequestMapping(method = RequestMethod.POST, value = "/api/signature/entity/generate/{entityName}", consumes = MediaType.TEXT_PLAIN_VALUE, produces = MediaType.TEXT_PLAIN_VALUE) From d324f871b8fd24d79e445f0d8865f53eb2795b90 Mon Sep 17 00:00:00 2001 From: Nikolaos Vastardis Date: Fri, 1 May 2026 09:55:33 +0100 Subject: [PATCH 5/6] Removig the unnecessary TestingFeignConfiguration --- .../vdesCtrl/TestFeignSecurityConfig.java | 35 ------------------- .../controllers/HTMLViewerControllerTest.java | 3 +- .../controllers/StationControllerTest.java | 4 +-- 3 files changed, 2 insertions(+), 40 deletions(-) delete mode 100644 src/test/java/org/grad/eNav/vdesCtrl/TestFeignSecurityConfig.java diff --git a/src/test/java/org/grad/eNav/vdesCtrl/TestFeignSecurityConfig.java b/src/test/java/org/grad/eNav/vdesCtrl/TestFeignSecurityConfig.java deleted file mode 100644 index 5c17ca0..0000000 --- a/src/test/java/org/grad/eNav/vdesCtrl/TestFeignSecurityConfig.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2024 GLA Research and Development Directorate - * - * 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 - * - * http://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.grad.eNav.vdesCtrl; - -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; - -import static org.mockito.Mockito.mock; - -/** - * This is a test configuration for implementing some Feign required security - * mocks. Use wisely... - * - * @author Nikolaos Vastardis (email: Nikolaos.Vastardis@gla-rad.org) - */ -@TestConfiguration -public class TestFeignSecurityConfig { - - -} diff --git a/src/test/java/org/grad/eNav/vdesCtrl/controllers/HTMLViewerControllerTest.java b/src/test/java/org/grad/eNav/vdesCtrl/controllers/HTMLViewerControllerTest.java index 2f99639..0a769ae 100644 --- a/src/test/java/org/grad/eNav/vdesCtrl/controllers/HTMLViewerControllerTest.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/controllers/HTMLViewerControllerTest.java @@ -16,7 +16,6 @@ package org.grad.eNav.vdesCtrl.controllers; -import org.grad.eNav.vdesCtrl.TestFeignSecurityConfig; import org.grad.eNav.vdesCtrl.TestingConfiguration; import org.grad.eNav.vdesCtrl.models.domain.Station; import org.grad.eNav.vdesCtrl.models.domain.StationType; @@ -44,7 +43,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @WebMvcTest(controllers = HTMLViewerController.class, excludeAutoConfiguration = {SecurityAutoConfiguration.class}) -@Import({TestingConfiguration.class, TestFeignSecurityConfig.class}) +@Import(TestingConfiguration.class) class HTMLViewerControllerTest { /** diff --git a/src/test/java/org/grad/eNav/vdesCtrl/controllers/StationControllerTest.java b/src/test/java/org/grad/eNav/vdesCtrl/controllers/StationControllerTest.java index 8cbea06..26e3e07 100644 --- a/src/test/java/org/grad/eNav/vdesCtrl/controllers/StationControllerTest.java +++ b/src/test/java/org/grad/eNav/vdesCtrl/controllers/StationControllerTest.java @@ -17,7 +17,6 @@ package org.grad.eNav.vdesCtrl.controllers; import tools.jackson.databind.ObjectMapper; -import org.grad.eNav.vdesCtrl.TestFeignSecurityConfig; import org.grad.eNav.vdesCtrl.TestingConfiguration; import org.grad.eNav.vdesCtrl.exceptions.DataNotFoundException; import org.grad.eNav.vdesCtrl.models.domain.SignatureMode; @@ -27,7 +26,6 @@ import org.grad.eNav.vdesCtrl.models.dtos.S100AbstractNode; import org.grad.eNav.vdesCtrl.models.dtos.datatables.*; import org.grad.eNav.vdesCtrl.services.StationService; -import org.grad.eNav.vdesCtrl.utils.GeometryJSONConverter; import org.grad.vdes1000.formats.generic.AISChannelPref; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -61,7 +59,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @WebMvcTest(controllers = StationController.class, excludeAutoConfiguration = {SecurityAutoConfiguration.class}) -@Import({TestingConfiguration.class, TestFeignSecurityConfig.class}) +@Import(TestingConfiguration.class) class StationControllerTest { /** From 7b48b0812d2054945c5c46ba382b2a0bd91b86e6 Mon Sep 17 00:00:00 2001 From: Nikolaos Vastardis Date: Fri, 1 May 2026 10:24:41 +0100 Subject: [PATCH 6/6] Missed one property change --- docker/conf/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/conf/application.properties b/docker/conf/application.properties index 4e6abb4..86ec232 100644 --- a/docker/conf/application.properties +++ b/docker/conf/application.properties @@ -10,7 +10,7 @@ service.variable.database.server.port= # Service properties server.port=8762 spring.application.name=vdes-ctrl -spring.application.version=0.0.5 +spring.application.version=0.0.6 # Disable the cloud config spring.cloud.config.enabled=false