Skip to content
Snippets Groups Projects
Unverified Commit 20ce0c1d authored by Martin Weise's avatar Martin Weise
Browse files

WIP

- Migration complete
parent e96d523c
No related branches found
No related tags found
2 merge requests!163Relase 1.3.0,!159Large update
Showing
with 81 additions and 95 deletions
...@@ -5,7 +5,7 @@ TRIVY_VERSION ?= v0.41.0 ...@@ -5,7 +5,7 @@ TRIVY_VERSION ?= v0.41.0
all: all:
build-backend: build-metadata-db build-database-service build-query-service build-table-service build-identifier-service build-container-service build-discovery-service build-gateway-service build-metadata-service build-analyse-service build-user-service build-backend: build-metadata-db build-database-service build-query-service build-table-service build-identifier-service build-container-service build-metadata-service build-analyse-service build-user-service
build-metadata-db: build-metadata-db:
mvn -f ./dbrepo-metadata-db/pom.xml clean install mvn -f ./dbrepo-metadata-db/pom.xml clean install
...@@ -22,12 +22,6 @@ build-container-service: build-metadata-db ...@@ -22,12 +22,6 @@ build-container-service: build-metadata-db
build-database-service: build-metadata-db build-database-service: build-metadata-db
mvn -f ./dbrepo-database-service/pom.xml clean package -DskipTests mvn -f ./dbrepo-database-service/pom.xml clean package -DskipTests
build-discovery-service: build-metadata-db
mvn -f ./dbrepo-discovery-service/pom.xml clean package -DskipTests
build-gateway-service: build-metadata-db
mvn -f ./dbrepo-gateway-service/pom.xml clean package -DskipTests
build-query-service: build-metadata-db build-query-service: build-metadata-db
mvn -f ./dbrepo-query-service/pom.xml clean package -DskipTests mvn -f ./dbrepo-query-service/pom.xml clean package -DskipTests
......
...@@ -23,6 +23,8 @@ RUN mvn -q clean package -DskipTests ...@@ -23,6 +23,8 @@ RUN mvn -q clean package -DskipTests
FROM openjdk:17-alpine as runtime FROM openjdk:17-alpine as runtime
MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> MAINTAINER Martin Weise <martin.weise@tuwien.ac.at>
RUN apk --no-cache add bash
ENV METADATA_DB=fda ENV METADATA_DB=fda
ENV METADATA_USERNAME=root ENV METADATA_USERNAME=root
ENV METADATA_PASSWORD=dbrepo ENV METADATA_PASSWORD=dbrepo
......
...@@ -32,10 +32,6 @@ ...@@ -32,10 +32,6 @@
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
......
...@@ -19,7 +19,6 @@ public class JacksonConfig { ...@@ -19,7 +19,6 @@ public class JacksonConfig {
@Bean @Bean
public ObjectMapper objectMapper() throws JsonProcessingException { public ObjectMapper objectMapper() throws JsonProcessingException {
final ObjectMapper objectMapper = new ObjectMapper(); final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();
objectMapper.registerModule(new Jdk8Module()); objectMapper.registerModule(new Jdk8Module());
objectMapper.registerModule(new JavaTimeModule()); objectMapper.registerModule(new JavaTimeModule());
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
......
...@@ -23,6 +23,8 @@ RUN mvn -q clean package -DskipTests ...@@ -23,6 +23,8 @@ RUN mvn -q clean package -DskipTests
FROM openjdk:17-alpine as runtime FROM openjdk:17-alpine as runtime
MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> MAINTAINER Martin Weise <martin.weise@tuwien.ac.at>
RUN apk --no-cache add bash
ENV METADATA_DB=fda ENV METADATA_DB=fda
ENV METADATA_USERNAME=root ENV METADATA_USERNAME=root
ENV METADATA_PASSWORD=dbrepo ENV METADATA_PASSWORD=dbrepo
......
...@@ -29,14 +29,11 @@ ...@@ -29,14 +29,11 @@
<swagger.version>2.2.9</swagger.version> <swagger.version>2.2.9</swagger.version>
<jacoco.version>0.8.10</jacoco.version> <jacoco.version>0.8.10</jacoco.version>
<jwt.version>4.3.0</jwt.version> <jwt.version>4.3.0</jwt.version>
<hibernate-c3po.version>5.6.3.Final</hibernate-c3po.version> <c3p0.version>0.9.5.5</c3p0.version>
<c3p0-hibernate.version>6.2.2.Final</c3p0-hibernate.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
...@@ -93,6 +90,16 @@ ...@@ -93,6 +90,16 @@
<version>${spring-cloud.version}</version> <version>${spring-cloud.version}</version>
</dependency> </dependency>
<!-- Data Source --> <!-- Data Source -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>${c3p0-hibernate.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId> <artifactId>spring-boot-starter-data-jpa</artifactId>
...@@ -121,11 +128,6 @@ ...@@ -121,11 +128,6 @@
<version>${project.version}</version> <version>${project.version}</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>${hibernate-c3po.version}</version>
</dependency>
<!-- Testing --> <!-- Testing -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
......
...@@ -22,10 +22,10 @@ public class ElasticsearchConfig { ...@@ -22,10 +22,10 @@ public class ElasticsearchConfig {
@Value("${spring.elasticsearch.uris}") @Value("${spring.elasticsearch.uris}")
private String elasticEndpoint; private String elasticEndpoint;
@Value("${fda.elastic.username}") @Value("${spring.elasticsearch.username}")
private String elasticUsername; private String elasticUsername;
@Value("${fda.elastic.password}") @Value("${spring.elasticsearch.password}")
private String elasticPassword; private String elasticPassword;
@Bean @Bean
......
...@@ -19,7 +19,6 @@ public class JacksonConfig { ...@@ -19,7 +19,6 @@ public class JacksonConfig {
@Bean @Bean
public ObjectMapper objectMapper() throws JsonProcessingException { public ObjectMapper objectMapper() throws JsonProcessingException {
final ObjectMapper objectMapper = new ObjectMapper(); final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();
objectMapper.registerModule(new Jdk8Module()); objectMapper.registerModule(new Jdk8Module());
objectMapper.registerModule(new JavaTimeModule()); objectMapper.registerModule(new JavaTimeModule());
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
......
...@@ -3,7 +3,8 @@ FROM dbrepo-metadata-db:latest as dependency ...@@ -3,7 +3,8 @@ FROM dbrepo-metadata-db:latest as dependency
MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> MAINTAINER Martin Weise <martin.weise@tuwien.ac.at>
###### SECOND STAGE ###### ###### SECOND STAGE ######
FROM maven:slim as build FROM maven:3-openjdk-17 as build
MAINTAINER Martin Weise <martin.weise@tuwien.ac.at>
COPY ./pom.xml ./ COPY ./pom.xml ./
...@@ -20,7 +21,10 @@ COPY ./report ./report ...@@ -20,7 +21,10 @@ COPY ./report ./report
RUN mvn -q clean package -DskipTests RUN mvn -q clean package -DskipTests
###### THIRD STAGE ###### ###### THIRD STAGE ######
FROM openjdk:11-jre-slim as runtime FROM openjdk:17-alpine as runtime
MAINTAINER Martin Weise <martin.weise@tuwien.ac.at>
RUN apk --no-cache add bash
ENV METADATA_DB=fda ENV METADATA_DB=fda
ENV METADATA_USERNAME=root ENV METADATA_USERNAME=root
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.10.RELEASE</version> <version>3.0.6</version>
</parent> </parent>
<groupId>at.tuwien</groupId> <groupId>at.tuwien</groupId>
...@@ -23,24 +23,21 @@ ...@@ -23,24 +23,21 @@
</modules> </modules>
<properties> <properties>
<java.version>11</java.version> <java.version>17</java.version>
<spring-cloud.version>3.0.1</spring-cloud.version> <spring-cloud.version>4.0.2</spring-cloud.version>
<mapstruct.version>1.4.2.Final</mapstruct.version> <mapstruct.version>1.5.5.Final</mapstruct.version>
<swagger.version>2.1.7</swagger.version> <docker.version>3.3.0</docker.version>
<springfox.version>3.0.0</springfox.version> <swagger.version>2.2.9</swagger.version>
<jacoco.version>0.8.7</jacoco.version> <jacoco.version>0.8.10</jacoco.version>
<javax-ws-rs.version>2.1.1</javax-ws-rs.version>
<maven-site.version>3.10.0</maven-site.version>
<docker.version>3.2.7</docker.version>
<commons-io.version>2.11.0</commons-io.version>
<jwt.version>4.3.0</jwt.version> <jwt.version>4.3.0</jwt.version>
<hibernate-c3po.version>5.6.3.Final</hibernate-c3po.version>
<commons-io.version>2.11.0</commons-io.version>
<opencsv.version>5.7.1</opencsv.version>
<super-csv.version>2.4.0</super-csv.version>
<jsql.version>4.6</jsql.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
...@@ -110,12 +107,6 @@ ...@@ -110,12 +107,6 @@
<artifactId>docker-java</artifactId> <artifactId>docker-java</artifactId>
<version>${docker.version}</version> <version>${docker.version}</version>
<scope>test</scope> <scope>test</scope>
<exclusions>
<exclusion>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.docker-java</groupId> <groupId>com.github.docker-java</groupId>
...@@ -124,11 +115,6 @@ ...@@ -124,11 +115,6 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<!-- Testing --> <!-- Testing -->
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>${javax-ws-rs.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId> <artifactId>spring-boot-starter-data-jpa</artifactId>
......
...@@ -4,7 +4,6 @@ import at.tuwien.api.error.ApiErrorDto; ...@@ -4,7 +4,6 @@ import at.tuwien.api.error.ApiErrorDto;
import at.tuwien.api.identifier.IdentifierCreateDto; import at.tuwien.api.identifier.IdentifierCreateDto;
import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.identifier.IdentifierDto;
import at.tuwien.api.identifier.IdentifierTypeDto; import at.tuwien.api.identifier.IdentifierTypeDto;
import at.tuwien.entities.database.DatabaseAccess;
import at.tuwien.entities.identifier.Identifier; import at.tuwien.entities.identifier.Identifier;
import at.tuwien.entities.user.User; import at.tuwien.entities.user.User;
import at.tuwien.exception.*; import at.tuwien.exception.*;
...@@ -27,8 +26,8 @@ import org.springframework.security.access.prepost.PreAuthorize; ...@@ -27,8 +26,8 @@ import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid; import jakarta.validation.Valid;
import javax.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import java.security.Principal; import java.security.Principal;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
......
...@@ -29,8 +29,8 @@ import org.springframework.security.access.prepost.PreAuthorize; ...@@ -29,8 +29,8 @@ import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid; import jakarta.validation.Valid;
import javax.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import java.security.Principal; import java.security.Principal;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
......
...@@ -27,6 +27,10 @@ spring: ...@@ -27,6 +27,10 @@ spring:
virtual-host: dbrepo virtual-host: dbrepo
username: fda username: fda
password: fda password: fda
elasticsearch:
password: elastic
username: elastic
uris: http://localhost:9200
management.endpoints.web.exposure.include: health,info,prometheus management.endpoints.web.exposure.include: health,info,prometheus
server: server:
port: 9096 port: 9096
...@@ -46,7 +50,3 @@ fda: ...@@ -46,7 +50,3 @@ fda:
client_id: dbrepo-client client_id: dbrepo-client
gateway.endpoint: https://localhost gateway.endpoint: https://localhost
website: https://localhost website: https://localhost
\ No newline at end of file
elastic:
endpoint: localhost:9200
username: elastic
password: elastic
\ No newline at end of file
...@@ -27,6 +27,10 @@ spring: ...@@ -27,6 +27,10 @@ spring:
virtual-host: dbrepo virtual-host: dbrepo
username: "${BROKER_USERNAME}" username: "${BROKER_USERNAME}"
password: "${BROKER_PASSWORD}" password: "${BROKER_PASSWORD}"
elasticsearch:
password: "${ELASTIC_PASSWORD}"
username: elastic
uris: http://search-service:9200
management.endpoints.web.exposure.include: health,info,prometheus management.endpoints.web.exposure.include: health,info,prometheus
server: server:
port: 9096 port: 9096
...@@ -46,7 +50,3 @@ fda: ...@@ -46,7 +50,3 @@ fda:
client_id: "${CLIENT_ID}" client_id: "${CLIENT_ID}"
gateway.endpoint: "${GATEWAY_ENDPOINT}" gateway.endpoint: "${GATEWAY_ENDPOINT}"
website: "${WEBSITE}" website: "${WEBSITE}"
\ No newline at end of file
elastic:
endpoint: search-service:9200
username: elastic
password: "${ELASTIC_PASSWORD}"
\ No newline at end of file
...@@ -75,7 +75,6 @@ public class PersistenceEndpointUnitTest extends BaseUnitTest { ...@@ -75,7 +75,6 @@ public class PersistenceEndpointUnitTest extends BaseUnitTest {
@Primary @Primary
public ObjectMapper objectMapper() { public ObjectMapper objectMapper() {
final ObjectMapper objectMapper = new ObjectMapper(); final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();
objectMapper.registerModule(new Jdk8Module()); objectMapper.registerModule(new Jdk8Module());
objectMapper.registerModule(new JavaTimeModule()); objectMapper.registerModule(new JavaTimeModule());
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
......
...@@ -6,6 +6,10 @@ import com.auth0.jwt.JWT; ...@@ -6,6 +6,10 @@ import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT; import com.auth0.jwt.interfaces.DecodedJWT;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
...@@ -16,10 +20,6 @@ import org.springframework.security.web.authentication.WebAuthenticationDetailsS ...@@ -16,10 +20,6 @@ import org.springframework.security.web.authentication.WebAuthenticationDetailsS
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.security.KeyFactory; import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
......
package at.tuwien.config; package at.tuwien.config;
import org.elasticsearch.client.RestHighLevelClient; import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import lombok.extern.log4j.Log4j2;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
@Log4j2
@Configuration @Configuration
public class ElasticsearchConfig { public class ElasticsearchConfig {
@Value("${fda.elastic.endpoint}") @Value("${spring.elasticsearch.uris}")
private String elasticEndpoint; private String elasticEndpoint;
@Value("${fda.elastic.username}") @Value("${spring.elasticsearch.username}")
private String elasticUsername; private String elasticUsername;
@Value("${fda.elastic.password}") @Value("${spring.elasticsearch.password}")
private String elasticPassword; private String elasticPassword;
@Bean @Bean
public RestHighLevelClient client() { public ElasticsearchClient elasticsearchClient() {
ClientConfiguration clientConfiguration = ClientConfiguration.builder() log.debug("elastic endpoint={}", elasticEndpoint);
.connectedTo(elasticEndpoint) final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
.withBasicAuth(elasticUsername, elasticPassword) credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(elasticUsername, elasticPassword));
final RestClient restClient = RestClient.builder(HttpHost.create(elasticEndpoint))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
.setDefaultCredentialsProvider(credentialsProvider))
.build(); .build();
ElasticsearchTransport transport = new RestClientTransport(
return RestClients.create(clientConfiguration).rest(); restClient, new JacksonJsonpMapper());
return new ElasticsearchClient(transport);
} }
@Bean
public ElasticsearchOperations elasticsearchTemplate() {
return new ElasticsearchRestTemplate(client());
}
} }
\ No newline at end of file
...@@ -21,7 +21,6 @@ public class JacksonConfig { ...@@ -21,7 +21,6 @@ public class JacksonConfig {
@Primary @Primary
public ObjectMapper objectMapper() throws JsonProcessingException { public ObjectMapper objectMapper() throws JsonProcessingException {
final ObjectMapper objectMapper = new ObjectMapper(); final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();
objectMapper.registerModule(new Jdk8Module()); objectMapper.registerModule(new Jdk8Module());
objectMapper.registerModule(new JavaTimeModule()); objectMapper.registerModule(new JavaTimeModule());
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
......
...@@ -6,14 +6,12 @@ import org.springframework.boot.context.event.ApplicationReadyEvent; ...@@ -6,14 +6,12 @@ import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.EventListener; import org.springframework.context.event.EventListener;
import javax.validation.constraints.NotNull;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@Configuration @Configuration
public class ReadyConfig { public class ReadyConfig {
@NotNull
@Value("${fda.ready.path}") @Value("${fda.ready.path}")
private String readyPath; private String readyPath;
......
...@@ -2,7 +2,7 @@ package at.tuwien.config; ...@@ -2,7 +2,7 @@ package at.tuwien.config;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.thymeleaf.spring5.SpringTemplateEngine; import org.thymeleaf.spring6.SpringTemplateEngine;
import org.thymeleaf.templatemode.TemplateMode; import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment