假设我有以下带有其父类的控制器:
@RestController
public class BusinessController extends RootController {
@GetMapping(value = "users", produces = {"application/json"})
@ResponseBody
public String users() {
return "{ \"users\": [] }"
}
@GetMapping(value = "companies", produces = {"application/html" target="_blank">json"})
@ResponseBody
public String companies() {
return "{ \"companies\": [] }"
}
}
@RestController
@RequestMapping(path = "api")
public class RootController {
}
通过调用以下URL检索数据:
http://app.company.com/api/users
http://app.company.com/api/companies
GET /api/users HTTP/1.1
Host: app.company.com
服务器请求:
HTTP/1.1 301 Moved Permanently
Location: http://app.company.com/rest/users
因此我计划在父控制器中从“API”
更改为“REST”
:
@RestController
@RequestMapping(path = "rest")
public class RootController {
}
然后介绍一个“遗留”控制器:
@RestController
@RequestMapping(path = "api")
public class LegacyRootController {
}
这就是我所苦恼的,我找不到任何与Spring相关的东西,不管是在StackOverflow还是其他地方。
另外,我有许多控制器和许多方法endpoint,所以我不能手动完成这一操作(例如,通过编辑每个@RequestMapping/@GetMapping注释)。
我正在做的项目是基于Spring Boot2.1的
编辑:我删除了/business
路径,因为实际上继承“在默认情况下”不起作用(请参见Spring MVC@requestmappings继承或启动时修改@requestmappings之类的问题与答案)--很抱歉。
我最终找到了一种实现方法,既可以作为javax.servlet.filter
实现,也可以作为org.springframework.web.server.webfilter
实现。
事实上,我引入适配器模式是为了转换两者:
org.springframework.http.server.servletserverhttpresponse
(非反应)和org.springframework.http.server.reactive.serverhttpresponse
(reactive)因为与共享org.springframework.HTTP.httpRequest
(允许我访问URI
和HttpHeaders
)的Spring HTTP请求包装器相反,响应的包装器不共享一个通用接口,所以我不得不模拟一个接口(这里特意以类似的方式命名为HttpPresponse
)。
@Component
public class RestRedirectWebFilter implements Filter, WebFilter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
ServletServerHttpRequest request = new ServletServerHttpRequest((HttpServletRequest) servletRequest);
ServletServerHttpResponse response = new ServletServerHttpResponse((HttpServletResponse) servletResponse);
if (actualFilter(request, adapt(response))) {
chain.doFilter(servletRequest, servletResponse);
}
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
if (actualFilter(exchange.getRequest(), adapt(exchange.getResponse()))) {
return chain.filter(exchange);
} else {
return Mono.empty();
}
}
/**
* Actual filtering.
*
* @param request
* @param response
* @return boolean flag specifying if filter chaining should continue.
*/
private boolean actualFilter(HttpRequest request, HttpResponse response) {
URI uri = request.getURI();
String path = uri.getPath();
if (path.startsWith("/api/")) {
String newPath = path.replaceFirst("/api/", "/rest/");
URI location = UriComponentsBuilder.fromUri(uri).replacePath(newPath).build().toUri();
response.getHeaders().setLocation(location);
response.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
response.flush();
return false;
}
return true;
}
interface HttpResponse extends HttpMessage {
void setStatusCode(HttpStatus status);
void flush();
}
private HttpResponse adapt(ServletServerHttpResponse response) {
return new HttpResponse() {
public HttpHeaders getHeaders() {
return response.getHeaders();
}
public void setStatusCode(HttpStatus status) {
response.setStatusCode(status);
}
public void flush() {
response.close();
}
};
}
private HttpResponse adapt(org.springframework.http.server.reactive.ServerHttpResponse response) {
return new HttpResponse() {
public HttpHeaders getHeaders() {
return response.getHeaders();
}
public void setStatusCode(HttpStatus status) {
response.setStatusCode(status);
}
public void flush() {
response.setComplete();
}
};
}
}
招呼 我有一个Spring Boot应用程序(1.4.1版)。之前从中设置 -支持thymeleaf模板中不严格的html。我只在电子邮件模板中使用Thymeleaf模板。该应用程序代表tho REST API,所有控制器返回数据。 然而,在我为电子邮件设置了Thymeleaf之后,一些请求正在为它们寻找Thymeleaf模板,并返回。 Thymeleaf配置(yml,这是Thymeleaf的所有
我是Spring Boot的新手,并试图构建一个简单的Web应用程序。我定义了一个包含我的url映射的控制器类,但在浏览器上它给我一个白标页面错误(404)。我无法理解为什么它无法映射。我尝试过更改我的组件扫描基础包,但它仍然没有将我重定向到控制台中的页面“abc”或打印“在控制器中”。 pom.xml 控制器类 主类
我的应用程序是简单的3-层Spring Boot rest Web服务,具有通常的同步endpoint。但是由于从我的服务发送请求的下游系统获得响应的时间相当长(有点像60秒),我需要向我的服务添加对异步REST调用的支持,以保存上游系统免于等待响应。换句话说,如果对下游系统的响应需要超过60秒(超时),那么上游系统会断开与我的服务的连接并继续运行... 但是当响应到来时,我的服务使用来自上游系统
> 我有两个控制器(ControllerA和ControllerB) 两个控制器都调用一个服务(MyService)。 MyService调用名为MyRepository的接口,该接口有两个实现(FirstRepository和SecondRepository)。 如何可能在从ControllerA调用服务(MyService)时使用FirstRepository而在调用来自ControllerB
我正在开发一个新的应用程序,它是和camel。我将RESTendpoint作为该应用程序的一部分公开。 null 你能帮我选择更好的方案吗?
我想验证请求参数。我已经浏览了很多博客并回答了问题,我也做了同样的事情。在控制器类上添加了@Validated。 控制器中的方法: 控制器建议 配置: 完成所有这些之后,现在我得到一个404错误。"状态":404,"错误":"未找到","消息":"没有可用的消息"