從我的控制器測驗中從 Spring Boot 2.5.5 升級到 2.5.6 觸發了這種型別的錯誤:
Spring Data REST 控制器 WidgetController$$EnhancerBySpringCGLIB$$9dfdd90c_3 不能在類級別使用@RequestMapping,因為這會導致與 Spring MVC 的雙重注冊!
Caused by: java.lang.IllegalStateException: Spring Data REST controller WidgetController$$EnhancerBySpringCGLIB$$9dfdd90c_3 must not use @RequestMapping on class level as this would cause double registration with Spring MVC!
at org.springframework.data.rest.webmvc.BasePathAwareHandlerMapping.isHandler(BasePathAwareHandlerMapping.java:165) ~[spring-data-rest-webmvc-3.5.6.jar:3.5.6]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.processCandidateBean(AbstractHandlerMethodMapping.java:265) ~[spring-webmvc-5.3.12.jar:5.3.12]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:225) ~[spring-webmvc-5.3.12.jar:5.3.12]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:213) ~[spring-webmvc-5.3.12.jar:5.3.12]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:206) ~[spring-webmvc-5.3.12.jar:5.3.12]
at org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration.restHandlerMapping(RepositoryRestMvcConfiguration.java:690) ~[spring-data-rest-webmvc-3.5.6.jar:3.5.6]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.12.jar:5.3.12]
... 88 common frames omitted
控制器遵循以下模式:
@RepositoryRestController
@RequestMapping("/api/widgets")
@RequiredArgsConstructor
public class WidgetController {
private final @NotNull WidgetHandler widgetHandler;
@GetMapping
public ResponseEntity<List<Widget>> widgets() {
return ResponseEntity.ok().body(widgetHandler./*...*/);
}
// ...
}
uj5u.com熱心網友回復:
更改@RepositoryRestController為@RestController:
@RestController @RequestMapping("/api/widgets") @RequiredArgsConstructor
public class WidgetController {
private final @NotNull WidgetHandler widgetHandler;
@GetMapping
public ResponseEntity<List<Widget>> widgets() {
return ResponseEntity.ok().body(widgetHandler./*...*/);
}
// ...
}
uj5u.com熱心網友回復:
與堆疊跟蹤一樣,例外由 BasePathAwareHandlerMapping 類中的 isHandler 方法拋出。
2.5.5
protected boolean isHandler(Class<?> beanType) {
Class<?> type = ProxyUtils.getUserClass(beanType);
return type.isAnnotationPresent(BasePathAwareController.class);
}
2.5.6
protected boolean isHandler(Class<?> beanType) {
...
if (AnnotatedElementUtils.hasAnnotation(type, RequestMapping.class)) {
throw new IllegalStateException(String.format(AT_REQUEST_MAPPING_ON_TYPE, beanType.getName()));
}
...
}
如果您需要 spring data rest 的功能并且您想使用@RepositoryRestController,您可以在方法級別使用@RequestMapping(或相關的@GetMapping、@PostMapping、...)和完整路徑。
@RepositoryRestController
@RequiredArgsConstructor
public class WidgetController {
private final @NotNull WidgetHandler widgetHandler;
@GetMapping("/api/widgets")
public ResponseEntity<List<Widget>> widgets() {
return ResponseEntity.ok().body(widgetHandler./*...*/);
}
// ...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/354083.html
