Erstellen von Federruhe-Diensten ohne Verwendung eines Federstiefels

74

Ich habe das Tutorial Erste Schritte auf spring.io zum Erstellen von REEST-Diensten https://spring.io/guides/gs/rest-service/ befolgt . Das Problem ist, dass in diesem Tutorial nur erklärt wird, wie ein eigenständiges Laufglas mit Tomcat erstellt wird, das mit Spring Boot eingebettet ist.

Gibt es eine Möglichkeit, ein Projekt von Grund auf neu zu erstellen, um einen Krieg zu erzeugen, der beispielsweise auf einer bereits vorhandenen Tomcat-Instanz bereitgestellt werden soll?

PS: Ich hatte in Tomcat einen früheren Thread Spring RESTful Service als WAR anstelle von JAR für Stackoverflow gefunden, der sich auf dasselbe Problem bezog. Das Problem ist, dass die akzeptierten Antworten und Vorschläge mein Problem nicht genau lösen, da ich nicht nach Möglichkeiten suche, das eigenständige App-Spring-Boot-Projekt so zu ändern, dass es auf einem externen Tomcat-Container funktioniert, aber eine finden möchte 'sauberere' Lösung ohne Federstiefel. (Ich bin mir nicht ganz sicher, wie ich mich hier verhalten soll, da ich bei Stackoverflow noch ziemlich neu bin. Ich hoffe, dass das Öffnen einer neuen Frage das richtige Verfahren ist.)

chrx
quelle
1
Welche Teile des Frühlingsstiefels finden Sie "unrein"? Wenn Sie wissen, welchen Teilen Sie abgeneigt sind, erhalten Sie eine bessere Antwort.
Digitaljoel
2
Nun, ich sprach von einer "saubereren" Lösung nur in Bezug darauf, dass ich kein Projekt mit einer Bibliothek erstellen muss (in diesem Fall booten, aber alles andere sein könnte) und dann eine Problemumgehung finden muss, damit der Code ohne sie funktioniert. Ich bezog mich nicht darauf, dass ein bestimmter Teil des Federstiefels nicht sauber war.
Chrx
@digitaljoel Ich stimme dieser Frage zu, Boot ist zu zurückgezogen. Ich bin mit Maven, Tomcat usw. vertraut. Ich möchte kein Glas bereitstellen und möchte so wenig Pom wie möglich (abhängig von so wenigen Plugins wie möglich). Ich finde es fast unmöglich, die wenigen Gläser zu finden, die ich für DI- und MVC-Annotationen (und möglicherweise Federdaten) mit den neuesten Versionen benötige.
NimChimpsky
2
Spring Boot bringt viele Abhängigkeiten mit sich. Viel. Und nach Meinung einiger Leute viel zu viel.
GranadaCoder
Jedes neue Framework wie Spring Boot sollte idealerweise die Komplexität reduzieren. Ich bin amüsiert, warum sie zusätzliche Komplexität eingeführt haben.
Stunner

Antworten:

65

Sie benötigen Spring Boot nicht, um einen Rest-Controller zu erstellen.

Befolgen Sie die Dokumentation zum Spring Framework zum Einrichten von MVC unter https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#spring-web

Das MVC-Setup (das DispatcherServlet) hängt von Ihrer Spring-Version ab. Sie können entweder XML verwenden oder programmgesteuert einrichten: https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc -Servlet

Sobald dies eingerichtet ist, können Sie Ihrer Anwendung einen Rest-Controller hinzufügen. Beachten Sie, dass ein Rest-Controller (die @RestControllerAnnotation) eine stereotype Annotation ist, die kombiniert @ResponseBodyund @Controllermit anderen Worten, der Controller ein Objekt im Antworttext zurückgibt, anstatt eine Ansicht zurückzugeben.

Dies ist ein perfektes Beispiel, das erklärt, was ich oben gesagt habe: http://www.programming-free.com/2014/01/spring-mvc-40-restful-web-services.html

selvinsource
quelle
4
Die von Ihnen bereitgestellten Links scheinen genau die Art von Anweisungen zu sein, nach denen ich gesucht habe. viele Panzer!
Chrx
25
Dies zeigt das klare Problem der Richtung des Frühlings. Es ist jetzt alles Frühlingsstiefel und es ist schwer, etwas zu finden, das keinen Frühlingsstiefel verwendet. IMHO Spring Boot macht viel zu viel Magie ...
R. van Twisk
4
@ R.vanTwisk völlig einverstanden
Koray Tugay
3
Spring Boot sollte in Spring Ball and Chain
Adam
14

Hier ist ein weiteres Beispiel:

Verzeichnislayout:

.
├── ./pom.xml
└── ./src
    └── ./src/main
        ├── ./src/main/java
        │   └── ./src/main/java/biz
        │       └── ./src/main/java/biz/tugay
        │           └── ./src/main/java/biz/tugay/restfulspring
        │               └── ./src/main/java/biz/tugay/restfulspring/config
        │                   ├── ./src/main/java/biz/tugay/restfulspring/config/RestfulHello.java
        │                   └── ./src/main/java/biz/tugay/restfulspring/config/WebAppInitalizer.java
        └── ./src/main/webapp
            └── ./src/main/webapp/WEB-INF
                └── ./src/main/webapp/WEB-INF/web.xml

pom.xml

<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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>biz.tugay</groupId>
    <artifactId>restfulSpring</artifactId>

    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>restfulSpring Maven Webapp</name>

    <url>http://maven.apache.org</url>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.3.16.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.16.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.16.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.16.RELEASE</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>restfulSpring</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.2.1.v20140609</version>
            </plugin>
        </plugins>
    </build>

</project>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
</web-app>

WebAppInitalizer.java

package biz.tugay.restfulspring.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

@Configuration
@EnableWebMvc
@ComponentScan("biz.tugay.restfulspring")
public class WebAppInitalizer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/*"};
    }

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{WebAppInitalizer.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[0];
    }
}

RestfulHello.java

package biz.tugay.restfulspring.config;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/")
public class RestfulHello {

    @RequestMapping(value = "hello")
    public ResponseEntity<String> sayHello() {
        final HttpHeaders httpHeaders= new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        return new ResponseEntity<String>("{\"msg\": \"Hello World\"}", httpHeaders, HttpStatus.OK);
    }
}

Erstellen und ausführen:

mvn clean install
mvn jetty:start

Prüfung:

> GET /hello HTTP/1.1
> Host: localhost:8080
> User-Agent: insomnia/5.15.0
> Accept: */*
< HTTP/1.1 200 OK
< Date: Fri, 27 Apr 2018 00:06:07 GMT
< Content-Type: application/json
< Content-Length: 22
< Server: Jetty(9.2.1.v20140609)

Inhalt erhalten:

{
    "msg": "Hello World"
}
Koray Tugay
quelle
Sie können das vollständige Erstellen von web.xml vermeiden, indem Sie das Maven-War-Plugin hinzufügen: <plugin> <artifactId> maven-war-plugin </ifactId> <version> 3.1.0 </ version> </ plugin>
Dmitry Avgustis