首页 > 解决方案 > spring.data.rest.basePath 未应用

问题描述

我想将前缀应用于休息 api 路径/api

我在 application.properties 中添加了这些行:

spring.data.rest.basePath=/api
server.servlet.context-path=/api
spring.jackson.default-property-inclusion=non_null

但是在我在 Wildfly 中部署代码后它不起作用:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/>
    </parent>
    <dependencies>
            <dependency>
                <groupId>com.fasterxml.jackson.dataformat</groupId>
                <artifactId>jackson-dataformat-xml</artifactId>
                <version>2.9.6</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.9.6</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.module</groupId>
                <artifactId>jackson-module-jaxb-annotations</artifactId>
                <version>2.9.6</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.jaxrs</groupId>
                <artifactId>jackson-jaxrs-json-provider</artifactId>
                <version>2.9.6</version>
            </dependency>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.6</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.woodstox</groupId>
                <artifactId>woodstox-core-asl</artifactId>
                <version>4.4.1</version>
            </dependency>
            <dependency>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>2.3.0</version>
            </dependency>
            <dependency>
                <groupId>com.sun.xml.bind</groupId>
                <artifactId>jaxb-core</artifactId>
                <version>2.3.0.1</version>
            </dependency>
            <dependency>
                <groupId>com.sun.xml.bind</groupId>
                <artifactId>jaxb-impl</artifactId>
                <version>2.3.0.1</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-jdk8</artifactId>
                <version>1.2.0.Final</version>
            </dependency>
            <dependency>
                <groupId>org.jxls</groupId>
                <artifactId>jxls-poi</artifactId>
                <version>1.0.15</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>javax</groupId>
                <artifactId>javaee-api</artifactId>
                <version>8.0</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.security.oauth</groupId>
                <artifactId>spring-security-oauth2</artifactId>
                <version>2.3.3.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.security.oauth.boot</groupId>
                <artifactId>spring-security-oauth2-autoconfigure</artifactId>
                <version>2.0.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-amqp</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-core</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-mail</artifactId>
            </dependency>
        </dependencies>
        <build>
            <finalName>datalis_admin</finalName>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
                    <configuration>
                        <packagingExcludes>WEB-INF/web.xml</packagingExcludes>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                    <configuration>
                        <source>10</source>
                        <target>10</target>
                        <encoding>${project.build.sourceEncoding}</encoding>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.1.0</version>
                    <configuration>
                        <encoding>${project.build.sourceEncoding}</encoding>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.0</version>
                </plugin>
            </plugins>
        </build>

应用启动方式:

@SpringBootApplication(scanBasePackages = { "org.admin.*", "org.plugin.service" })
@EntityScan("org.plugin.entity")
public class Application extends SpringBootServletInitializer implements WebMvcConfigurer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

由于某种原因/api未添加到映射端点中:

2018-10-08 12:32:19,060 INFO  [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (ServerService Thread Pool -- 81) Mapped "{[/transactions/{id}],methods=[GET]}" onto public org.springframework.http.ResponseEntity<?> org.datalis.admin.backend.restapi.PaymentTransactionsController.get(java.lang.String)
2018-10-08 12:32:19,061 INFO  [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (ServerService Thread Pool -- 81) Mapped "{[/transactions/{id}],methods=[POST]}" onto public org.springframework.http.ResponseEntity<?> org.datalis.admin.backend.restapi.PaymentTransactionsController.save(java.lang.String,org.datalis.admin.backend.restapi.dto.PaymentTransactionsDTO)
2018-10-08 12:32:19,064 INFO  [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (ServerService Thread Pool -- 81) Mapped "{[/transactions],methods=[POST]}" onto public org.springframework.http.ResponseEntity<?> org.datalis.admin.backend.restapi.PaymentTransactionsController.create(org.datalis.admin.backend.restapi.dto.PaymentTransactionsDTO)
2018-10-08 12:32:19,065 INFO  [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (ServerService Thread Pool -- 81) Mapped "{[/transactions],methods=[GET]}" onto public org.springframework.data.domain.Page<org.datalis.admin.backend.restapi.dto.PaymentTransactionsDTO> org.datalis.admin.backend.restapi.PaymentTransactionsController.find(org.datalis.admin.backend.restapi.dto.PaymentTransactionsFilterDTO,org.springframework.data.domain.Pageable)
2018-10-08 12:32:19,069 INFO  [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (ServerService Thread Pool -- 81) Mapped "{[/transactions/export],methods=[GET]}" onto public void org.datalis.admin.backend.restapi.PaymentTransactionsController.export(javax.servlet.http.HttpServletResponse)
2018-10-08 12:32:19,073 INFO  [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (ServerService Thread Pool -- 81) Mapped "{[/transactions/types],methods=[GET]}" onto public org.springframework.http.ResponseEntity<?> org.datalis.admin.backend.restapi.PaymentTransactionsController.getTypes()
2018-10-08 12:32:19,078 INFO  [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (ServerService Thread Pool -- 81) Mapped "{[/users/reset],methods=[POST]}" onto public org.springframework.http.ResponseEntity<?> org.datalis.admin.backend.restapi.UserController.reset(org.datalis.admin.backend.restapi.dto.PasswordResetDTO)
2018-10-08 12:32:19,079 INFO  [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (ServerService Thread Pool -- 81) Mapped "{[/users/token],methods=[POST]}" onto public org.springframework.http.ResponseEntity<?> org.datalis.admin.backend.restapi.UserController.token(org.datalis.admin.backend.restapi.dto.PasswordResetDTO)
2018-10-08 12:32:19,080 INFO  [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (ServerService Thread Pool -- 81) Mapped "{[/users/request],methods=[POST]}" onto public org.springframework.http.ResponseEntity<?> org.datalis.admin.backend.restapi.UserController.resetRequest(org.datalis.admin.backend.restapi.dto.PasswordResetDTO)
2018-10-08 12:32:19,092 INFO  [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (ServerService Thread Pool -- 81) Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2018-10-08 12:32:19,093 INFO  [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] (ServerService Thread Pool -- 81) Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)

标签: springspring-bootspring-restcontroller

解决方案


Spring Boot 支持的所有server.*属性仅适用于嵌入式 servlet 容器的配置 (Tomcat, Jetty, or Undertow)

如果您将 Spring Boot 应用程序部署到独立服务器/Jboss Wildfly,那么您需要使用它提供的任何机制来配置该服务器。

请通过 jboss-web.xml 文件中的设置配置上下文根变量。

通过在您部署的应用程序中添加 /WEB-INF/jboss-web.xml 文件,您可以这样做:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
      http://www.jboss.com/xml/ns/javaee
      http://www.jboss.org/j2ee/schema/jboss-web_5_1.xsd">
   <context-root>/api</context-root>
</jboss-web>

更新

如果应用程序具有名称 package_admin 并且没有配置上下文根,则应使用整个文件名调用该应用程序;所以在你的情况下,如果你想在wildfly中使用api作为默认上下文路径,那么如果你没有明确配置上下文路径,那么使用api作为你的war文件名。

但是,我们希望应用程序仅使用更简单的上下文根(例如 /api/)来调用,但文件名总是需要管理版本控制等,因此配置应用程序的上下文根始终是个好主意。

要执行此配置,需要在应用程序的 WEB-INF 文件夹中创建一个新文件;这是 web.xml 文件所在的同一目录。

这个设置是为一个名为 jboss-web.xml 的文件进行的,它应该放在 WEB-INF...


推荐阅读