为啥 Spring WebFlux 应用程序不支持 @RestController 映射前缀?
Posted
技术标签:
【中文标题】为啥 Spring WebFlux 应用程序不支持 @RestController 映射前缀?【英文标题】:Why doesn't a Spring WebFlux app honor the @RestController mapping prefiix?为什么 Spring WebFlux 应用程序不支持 @RestController 映射前缀? 【发布时间】:2020-02-23 07:31:49 【问题描述】:我在我的 Spring Boot WebFlux 应用中注意到映射与 MVC 不同。
在 MVC 中,我可以添加一个RestController("/prefix")
,这样我的方法都会以/prefix
为前缀。但在 WebFlux 中,这是行不通的。
这是设计的吗?
注意 - 我换掉了 Mono<>
返回类型,看看它是否有所不同,以防这里有一些其他的自省。
例如,这是控制器-
@RestController("/api/user")
public class UserController
private UserService service;
public UserController(UserService service)
this.service = service;
@GetMapping("/me")
public Map<String, Object> whoami(@AuthenticationPrincipal OAuth2User oauth2User)
HashMap<String, Object> response = new HashMap<>();
if (null != oauth2User)
response.put("userName", oauth2User.getName());
response.put("userAttributes", oauth2User.getAttributes());
return response;
else
response.put("userName", "anonymous");
return response;
...
在我期望的地方找不到映射。
虽然,它是在这里找到的——
我认为关于依赖关系的评论是正确的 - 其中之一是引发冲突。
dependencies
implementation project(":shared:domain")
implementation 'org.springframework.cloud:spring-cloud-starter-gateway',
'org.springframework.cloud:spring-cloud-starter-security',
'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client',
'org.springframework.boot:spring-boot-starter-webflux',
'org.springframework.boot:spring-boot-starter-oauth2-client',
'org.zalando:problem-spring-webflux:0.25.0',
"com.okta.sdk:okta-sdk-api:$oktaVersion"
runtime "com.okta.sdk:okta-sdk-impl:$oktaVersion",
"com.okta.sdk:okta-sdk-httpclient:$oktaVersion"
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
【问题讨论】:
你能分享你的依赖吗?看来你们之间可能有冲突。 请不要发布您的代码图片。 您不能添加带有@RestController("/some/thing/here")
的前缀。 @RestController
是专门的 @Controller
,这是一个 @Component
。 @Component
采用名称。因此,您现在已经为控制器分配了 /api/user
的 bean-name 而不是 URL 前缀。如果这是你想要的,你需要添加一个@RequestMapping("/api/user")
。
更喜欢使用路由器功能而不是控制器。有关更多详细信息,请参阅此帖子***.com/questions/47092029/…
【参考方案1】:
@RestController("/api/user")
不分配 URL 前缀,它为您的控制器分配给定名称。请参阅javadoc。 @RestController
是@Controller
原型注解的特化,它是@Component
。 @Component
采用 value
并且 value
将用作给定组件的名称。如果没有给出名称,则将自动生成名称。
如果你想要一个前缀,你需要在控制器类上添加一个 @RequstMapping("/api/user")
。
【讨论】:
哇哦——我就知道了。这证明我应该每天至少睡一次。哈哈!谢谢!以上是关于为啥 Spring WebFlux 应用程序不支持 @RestController 映射前缀?的主要内容,如果未能解决你的问题,请参考以下文章
为啥spring webflux默认选择jetty然后失败?
Spring Webflux + JPA:JPA 不支持反应式存储库
为啥 Spring Webflux 只能并行接受 256 个请求?
为啥默认配置的spring webflux中没有异常堆栈跟踪?
Webflux - Spring Boot - 具有 http 代理支持的 oAuth2 客户端
Spring Webflux注解的rest控制器不支持ServerHttpRequest作为方法参数:java.lang.NoSuchMethodException