Java 在不使用 spring boot 的情况下创建 spring rest 服务

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/29416804/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 07:57:55  来源:igfitidea点击:

creating spring rest services without using spring boot

javaspringresttomcat

提问by chrx

I've followed the Getting Started tutorial on spring.io for building REEST services https://spring.io/guides/gs/rest-service/. The problem is that this tutorial only explain how to produce a standalone running jar with tomcat embedded using spring boot.

我已经按照 spring.io 上的入门教程来构建 REEST 服务https://spring.io/guides/gs/rest-service/。问题是本教程只解释了如何使用 spring boot 生成一个嵌入了 tomcat 的独立运行 jar。

Is there a way to create a project from scratch to produce a war to deploy for instance on an already existing tomcat instance?

有没有办法从头开始创建一个项目来产生一场战争,例如在已经存在的 tomcat 实例上进行部署?

PS: I had found a previous thread Spring RESTful Service as a WAR instead of JAR in Tomcaton stackoverflow concerning the very same issue. The problem is that the accepted answers and suggestions doesn't exactly solve my problem, since I'm not looking for ways to modify the standalone-app spring boot project so that it works on an external tomcat container, but would like to find a 'cleaner' solution not involving spring boot at all. (I'm not exactly sure how to behave here, being still quite new at stackoverflow. I hope that opening a new question is the correct procedure).

PS:我在 stackoverflow 上发现了一个以前的线程Spring RESTful Service as a WAR 而不是 JAR,关于同样的问题。问题是接受的答案和建议并不能完全解决我的问题,因为我不是在寻找修改独立应用程序 spring boot 项目的方法,以便它可以在外部 tomcat 容器上运行,但想找到一个“更清洁”的解决方案根本不涉及弹簧靴。(我不太确定这里的行为方式,在 stackoverflow 中仍然很新。我希望打开一个新问题是正确的过程)。

采纳答案by selvinsource

You don't need Spring Boot to create a rest controller.

您不需要 Spring Boot 来创建休息控制器。

Please follow the spring framework documentation on how to setup MVC https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#spring-web

请按照 spring 框架文档了解如何设置 MVC https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#spring-web

The MVC setup (the DispatcherServlet) depends on your spring version, you can either use xml or you can setup programmatically: https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-servlet

MVC 设置 (the DispatcherServlet) 取决于您的 spring 版本,您可以使用 xml 或以编程方式设置:https: //docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc -servlet

Once this is setup, you can add a rest controller to your application. Note that a rest controller (the @RestControllerannotation) is a stereotype annotation that combines @ResponseBodyand @Controller, in other words the Controller returns an object in the response body instead of returning a view.

设置完成后,您可以向应用程序添加休息控制器。请注意,rest 控制器(@RestController注释)是组合了@ResponseBodyand@Controller的构造型注释,换句话说,控制器在响应正文中返回一个对象,而不是返回一个视图。

This is a perfect example explaining what I said above: http://www.programming-free.com/2014/01/spring-mvc-40-restful-web-services.html

这是一个完美的例子来解释我上面所说的:http: //www.programming-free.com/2014/01/spring-mvc-40-restful-web-services.html

回答by Koray Tugay

Here is another example:

这是另一个例子:

Directory Layout:

目录布局:

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

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

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

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

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

Build and run:

构建并运行:

mvn clean install
mvn jetty:start

Test:

测试:

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

Content received:

收到的内容:

{
    "msg": "Hello World"
}