是否有任何配置选项允许仅为其他控制器更改基本URL,例如,如果我的api的基本URL是www.example.com/user/{id},则变为www.example.com/rest/user/{id}?
我使用的是spring boot v1.3.2
我尝试创建自定义注释,通过添加RequestMapping扩展RestController.这是一个例子,但它不起作用.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@RestController
@RequestMapping(value = "/rest", path = "/rest")
public @interface MyRestController { }
Run Code Online (Sandbox Code Playgroud)
Kyl*_*son 23
创建一个自定义注释,声明基本URL并使用它来代替@RestController.
CustomRestControllerAnnotation.java
package com.example.stackoverflow.config;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@RestController
@RequestMapping("/rest")
public @interface CustomRestControllerAnnotation {}
Run Code Online (Sandbox Code Playgroud)
FirstRestController.java
package com.example.stackoverflow.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.example.stackoverflow.config.CustomRestControllerAnnotation;
@CustomRestControllerAnnotation
public class FirstRestController {
@RequestMapping("/first")
public String firstMethod(){
return "First Controller";
}
}
Run Code Online (Sandbox Code Playgroud)
SecondRestController.java
package com.example.stackoverflow.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.example.stackoverflow.config.CustomRestControllerAnnotation;
@CustomRestControllerAnnotation
public class SecondRestController {
@RequestMapping("/second")
public String secondMethod(){
return "Second Controller";
}
}
Run Code Online (Sandbox Code Playgroud)
通过创建用作所有实际控制器模板的基本控制器,您可以从单个位置有效地管理根URL.
BaseRestController.java
package com.example.stackoverflow.controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/rest")
public class BaseRestController {}
Run Code Online (Sandbox Code Playgroud)
然后,您只需为所有实际控制器扩展此类.
FirstRestController.java
package com.example.stackoverflow.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FirstRestController extends BaseRestController{
@RequestMapping("/first")
public String firstMethod(){
return "First Controller";
}
}
Run Code Online (Sandbox Code Playgroud)
SecondRestController.java
package com.example.stackoverflow.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SecondRestController extends BaseRestController{
@RequestMapping("/second")
public String secondMethod(){
return "Second Controller";
}
}
Run Code Online (Sandbox Code Playgroud)
如果您的控制器正在从存储库提供数据,那么Spring Data REST可以取出大部分样板并解决您的初始问题.
的pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
通过声明此依赖关系,您的所有存储库都会自动启用REST.
您可以使用属性文件来控制基本URL.
application.properties
spring.data.rest.basePath=/rest
Run Code Online (Sandbox Code Playgroud)
通常,您会定义一个 Servlet 来处理所有(或一组特定)的 Restful 请求。然后,您可以告诉该 servlet 监听特定的 URL 模式,例如/rest. 这@RequestMapping不知道该“顶级”模式。
例如,在引导 Spring Web 应用程序时,您可以手动创建该 Restful Servlet 并添加映射。整个设置有点太大,无法在此处发布,但可以在下面找到一个片段来了解概念。
import org.springframework.web.servlet.DispatcherServlet;
import javax.servlet.ServletContext;
...
public class WebAppInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
...
ServletRegistration.Dynamic restfulServlet = servletContext.addServlet("myServlet", new DispatcherServlet(rootContext));
restfulServlet.addMapping("/rest/*");
...
}
Run Code Online (Sandbox Code Playgroud)