IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Web Java Discussion :

Packager un WAR avec Spring en 2023


Sujet :

Spring Web Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut Packager un WAR avec Spring en 2023
    Bonjour,

    Ce sujet va avec la discussion ici:
    https://www.developpez.net/forums/d2...ffichage-page/

    J'ai un véritable problème bloquant, et je n'arrive pas à trouver une solution satisfaisante.

    Je dois construire un projet, avec Spring, qui va vers une page HTML, mais comme la page HTML sera avec un framework Javascript (comme Vue.JS), je dois pouvoir appeler des Rest Controller.

    Autant je vais sur la page HTML, mais pour les services REST, il est totalement à la ramasse.

    Vital, comme j'ai un existant, je dois packager en WAR (et non en JAR).

    Pour commencer, l'architecture du projet:
    Nom : pb_2023_02_27_p1.png
Affichages : 498
Taille : 35,3 Ko

    J'ai le POM suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>com.spring.tomcat.war.test</groupId>
    	<artifactId>com.spring.tomcat.war.test</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>com.spring.tomcat.war.test</name>
    	<description>com.spring.tomcat.war.test</description>
    	<packaging>war</packaging>
     
    	<properties>
    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    		<encoding>UTF-8</encoding>
    		<java.version>1.8</java.version>
    	</properties>	
     
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.3.10.RELEASE</version>
    		<relativePath/> <!-- lookup parent from repository -->
    	</parent>
     
     
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-tomcat</artifactId>
    			<scope>provided</scope>
    		</dependency>
     
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter</artifactId>
    		</dependency>
     
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    	</dependencies>
     
    	<build>
    		<finalName>${project.artifactId}</finalName>
    		<plugins>
    			<plugin>
    				<groupId>org.apache.maven.plugins</groupId>
    				<artifactId>maven-war-plugin</artifactId>
    				<executions>
    					<execution>
    						<id>default-war</id>
    						<phase>prepare-package</phase>
    						<configuration>
    							<failOnMissingWebXml>false</failOnMissingWebXml>
    						</configuration>
    					</execution>
    				</executions>
    			</plugin>
    		</plugins>
    	</build>
    </project>
    Pour la DTO, je crée la DTO bidon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    package com.spring.tomcat.war.test.dto;
     
    public class TestDTO {
     
    	private Integer numero;
     
    	private String message;
     
    	public Integer getNumero() {
    		return numero;
    	}
     
    	public void setNumero(Integer numero) {
    		this.numero = numero;
    	}
     
    	public String getMessage() {
    		return message;
    	}
     
    	public void setMessage(String message) {
    		this.message = message;
    	}
     
     
    }
    Je définis le service suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    package com.spring.tomcat.war.test.service;
     
    import java.util.List;
     
    import com.spring.tomcat.war.test.dto.TestDTO;
     
    public interface ServiceTest {
     
    	List<TestDTO> getTest();
    }
    Dont l'implémentation est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    package com.spring.tomcat.war.test.service;
     
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
     
    import org.springframework.stereotype.Service;
     
    import com.spring.tomcat.war.test.dto.TestDTO;
     
    @Service
    public class ServiceTestImpl implements ServiceTest{
     
    	public ServiceTestImpl() {
    		System.out.println("Constructeur Test");
    	}
     
    	@Override
    	public List<TestDTO> getTest() {
    		Random random = new Random();
    		final int number = random.nextInt(20);
    		List<TestDTO> lReturn = new ArrayList<>();
    		TestDTO dto;
    		for(int i = 0; i < number;i++) {
    			dto = new TestDTO();
    			dto.setNumero(i);
    			dto.setMessage("Message "+i);
    		}
    		return lReturn;
    	}
    }
    On arrive au controller:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    package com.spring.tomcat.war.test.controller;
     
    import java.util.List;
     
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    import com.spring.tomcat.war.test.dto.TestDTO;
    import com.spring.tomcat.war.test.service.ServiceTest;
     
    @RestController
    @RequestMapping("/test")
    public class TestController {
     
    	private final ServiceTest serviceTest;
     
    	public TestController(ServiceTest serviceTest) {
    		System.err.println("Test");
    		this.serviceTest = serviceTest;
    	}
     
    	@GetMapping(value = "/all",produces = {MediaType.APPLICATION_JSON_VALUE})
    	public ResponseEntity<List<TestDTO>> getAll(){
    		return ResponseEntity.ok(serviceTest.getTest());
    	}
    }
    Et la classe de configuration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    package com.spring.tomcat.war.test.configuration;
     
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
     
    @Configuration
    @ComponentScan(basePackages = {"com.spring.tomcat.war.test.controller","com.spring.tomcat.war.test.service"})
    public class TestConfiguration extends SpringBootServletInitializer implements WebMvcConfigurer{
     
    	@Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(TestConfiguration.class);
        }
    }
    Le lancement (ici par Eclipse) permet de voir que les constructeurs sont appelé, dans le bon ordre, et si on debug, on a bien des valeurs de classes (et non pas null):
    Nom : pb_2023_02_27_p2.png
Affichages : 441
Taille : 24,4 Ko

    Et la page index.html est appelée:
    Nom : pb_2023_02_27_p3.png
Affichages : 438
Taille : 11,4 Ko

    Seulement, pas le service REST:
    Nom : pb_2023_02_27_p4.png
Affichages : 438
Taille : 14,3 Ko

    Et pas de trace dans la console d'Eclipse.

    Bref, je sais que j'ai loupé quelque chose, mais je n'arrive pas à mettre la main dessus.

    Cordialement.

  2. #2
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut
    J'ai finalement résolu le problème.
    Il faut ajouter @EnableAutoConfiguration (et accessoirement corriger le code du service de test, mais ce n'est pas le fond du problème).

    Donc pour le service:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    package com.spring.tomcat.war.test.service;
     
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
     
    import org.springframework.stereotype.Service;
     
    import com.spring.tomcat.war.test.dto.TestDTO;
     
    @Service
    public class ServiceTestImpl implements ServiceTest{
     
    	public ServiceTestImpl() {
    		System.out.println("Constructeur Test");
    	}
     
    	@Override
    	public List<TestDTO> getTest() {
    		Random random = new Random();
    		final int number = random.nextInt(20);
    		List<TestDTO> lReturn = new ArrayList<>();
    		TestDTO dto;
    		for(int i = 0; i < number;i++) {
    			dto = new TestDTO();
    			dto.setNumero(i);
    			dto.setMessage("Message "+i);
    			lReturn.add(dto);//Ceci a été oublié
    		}
    		return lReturn;
    	}
    }
    Et pour la config:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    package com.spring.tomcat.war.test.configuration;
     
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
     
    @EnableAutoConfiguration
    @Configuration
    @ComponentScan(basePackages = {"com.spring.tomcat.war.test.controller","com.spring.tomcat.war.test.service"})
    public class TestConfiguration extends SpringBootServletInitializer implements WebMvcConfigurer{
     
    	@Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(TestConfiguration.class);
        }
    }
    On arrive à:
    Nom : pb_2023_02_27_soluce.png
Affichages : 436
Taille : 21,2 Ko

  3. #3
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut
    Pour préciser la réponse, pour que si on appelle l'URL du site on envoie la page HTML, il faut ajouter le controlleur suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    package com.spring.tomcat.war.test.controller;
     
    import java.io.IOException;
     
    import javax.servlet.http.HttpServletResponse;
     
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
     
    @Controller
    public class IndexController {
     
    	private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
     
    	@RequestMapping({"" ,"/", })
        public void redirect(HttpServletResponse response) throws IOException {
            LOGGER.info("Redirect...");
            response.sendRedirect("./index.html");
        }
     
    }
    Attention, l'annotation devient @Controller (et non @RestController).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/08/2010, 15h09
  2. Réponses: 5
    Dernier message: 12/05/2006, 22h02
  3. [Framework] HelloWorld avec Spring AOP
    Par LaJavanaise dans le forum Spring
    Réponses: 8
    Dernier message: 03/03/2006, 10h16
  4. [ANT]Création d'un WAR avec ANT ?
    Par elitost dans le forum ANT
    Réponses: 9
    Dernier message: 22/03/2005, 19h24
  5. projet .war avec Eclipse
    Par CapToMatteo dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 20/04/2004, 14h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo