створення служб весняного відпочинку без використання весняного завантаження


74

Я дотримувався підручника „Початок роботи” на spring.io щодо створення служб REEST https://spring.io/guides/gs/rest-service/ . Проблема полягає в тому, що цей підручник пояснює лише, як створити автономну працюючу банку з вбудованим tomcat за допомогою пружинного завантаження.

Чи є спосіб створити проект з нуля, щоб створити війну для розгортання, наприклад, на вже існуючому екземплярі tomcat?

PS: Я знайшов попередній потік Spring RESTful Service як WAR замість JAR у Tomcat на stackoverflow стосовно тієї самої проблеми. Проблема полягає в тому, що прийняті відповіді та пропозиції не точно вирішують мою проблему, оскільки я не шукаю способів змінити проект весняного завантаження автономного додатку, щоб він працював на зовнішньому контейнері tomcat, але хотів би знайти "чистіше" рішення, яке взагалі не включає пружинне завантаження. (Я не зовсім впевнений, як тут поводитися, будучи ще досить новим у stackoverflow. Я сподіваюся, що відкриття нового питання - це правильна процедура).


1
Які частини весняного багажника ви вважаєте "нечистими"? Знання, до яких частин ви проти, допомогло б отримати кращу відповідь.
digitaljoel

2
Ну, я говорив про "чистіше" рішення лише стосовно того, що не потрібно створювати проект за допомогою якоїсь бібліотеки (в даному випадку завантаження, але це може бути що-небудь інше), тоді мені доведеться знайти якесь обхідне рішення, щоб змусити код працювати без нього; Я не мав на увазі, що якась конкретна частина весняного завантаження не була чистою.
chrx

@digitaljoel Я повторюю це запитання, завантаження занадто позбавлене. Я знайомий з maven, tomcat і т. Д. - Я не хочу розгортати jar і хочу якомога менше пам’яті (залежно від якомога менше плагінів). Я вважаю, що практично неможливо знайти кілька банок, які мені потрібні для анотацій DI та MVC (і, можливо, весняних даних), з останніми версіями.
NimChimpsky

2
Spring Boot приносить багато залежностей. Багато. І, на думку деяких людей, занадто багато.
granadaCoder

Будь-який новий фреймворк, як пружинне завантаження, в ідеалі повинен зменшити складність. Мене розважає, чому вони ввели додаткову складність ..
Stunner

Відповіді:


65

Вам не потрібно Spring Boot для створення контролера відпочинку.

Будь ласка, дотримуйтесь весняної фреймворкової документації про те, як встановити MVC https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#spring-web

Налаштування MVC ( DispatcherServlet) залежить від вашої весняної версії, ви можете використовувати xml або програмувати: https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc -сервлет

Після налаштування ви можете додати контролер відпочинку у свою програму. Зверніть увагу, що контролер відпочинку ( @RestControllerанотація) - це стереотипна анотація, яка поєднує, @ResponseBodyі @Controller, іншими словами, Контролер повертає об'єкт у тілі відповіді замість повернення подання.

Це прекрасний приклад, що пояснює те, що я сказав вище: http://www.programming-free.com/2014/01/spring-mvc-40-restful-web-services.html


4
посилання, які ви надаєте, здаються дуже тими інструкціями, які я шукав. багато танків!
chrx

25
Це показує чітку проблему напрямку Весни. Зараз все весняне завантаження, і важко знайти щось, що не використовує весняне завантаження. IMHO Spring Boot робить шлях до великої магії ...
Р. ван Твіск

4
@ R.vanTwisk повністю погодився
Корай Тугай

3
Spring Boot слід перейменувати на Spring Ball and Chain
Адам

14

Ось ще один приклад:

Макет каталогу:

.
├── ./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);
    }
}

Створення та запуск:

mvn clean install
mvn jetty:start

Тест:

> 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)

Отриманий вміст:

{
    "msg": "Hello World"
}

Ви можете уникнути створення web.xml повністю, додавши плагін maven war: <plugin> <artifactId> maven-war-plugin </artifactId> <version> 3.1.0 </version> </plugin>
Дмитро Августіс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.