![](/img/trans.png)
[英]Spring Data REST controller must not use @RequestMapping on class level as this would cause double registration with Spring MVC
[英]spring boot registering rest controller doesn't work without class level requestmapping
引導應用程序,但是,即使我的服務組件在Spring上下文中顯示為已注冊的bean,其URL也未得到注冊。 基本上,要注冊具有方法級別@RequestMapping
批注的組件,我需要定義類級別的請求映射。 然后,它的spring上下文能夠注冊url處理程序。
我的目錄結構看起來像;
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── awesomecrypto
│ │ │ └── backend
│ │ │ ├── SpringBootApp.java
│ │ │ ├── entity
│ │ │ │ └── MarketData.java
│ │ │ ├── repository
│ │ │ │ └── MarketDataRepository.java
│ │ │ └── service
│ │ │ └── MarketDataService.java
│ │ └── resources
SpringBootApp.java
package com.awesomecrypto.backend;
// import statements.
@SpringBootApplication
public class SpringBootApp {
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(SpringBootApp.class, args);
for (String name: applicationContext.getBeanDefinitionNames()) {
System.out.println(name);
}
}
}
MarketDataService
package com.awesomecrypto.backend.service;
// import statements here.
@Component
public class MarketDataService {
@Autowired
private MarketDataRepository marketDataRepository;
@GetMapping("/marketData")
@ResponseBody
public String getMarketData() {
return "foobar";
}
}
沒有在MarketDataService
類級別上定義@RequestMapping
,就不會為“ / marketData” URL注冊任何URL處理程序。
2018-05-28 15:15:11.357 INFO 30618 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2018-05-28 15:15:11.357 INFO 30618 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1295 ms
2018-05-28 15:15:11.460 INFO 30618 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/]
2018-05-28 15:15:11.465 INFO 30618 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2018-05-28 15:15:11.465 INFO 30618 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2018-05-28 15:15:11.465 INFO 30618 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-05-28 15:15:11.465 INFO 30618 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]
2018-05-28 15:15:11.601 INFO 30618 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-05-28 15:15:11.813 INFO 30618 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6c65519: startup date [Mon May 28 15:15:10 PDT 2018]; root of context hierarchy
2018-05-28 15:15:11.915 INFO 30618 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : 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-05-28 15:15:11.916 INFO 30618 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : 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)
2018-05-28 15:15:11.939 INFO 30618 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-05-28 15:15:11.939 INFO 30618 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
另一方面, marketDataService
是在春季上下文中注冊的,這沒有任何意義。 這是相關的getBeanDefinitionNames
日志。
org.springframework.context.event.internalEventListenerFactory
springBootApp
org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory
marketDataRepository
marketDataService
org.springframework.boot.autoconfigure.AutoConfigurationPackages
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
org.springframework.boot.autoconfigure.condition.BeanTypeRegistry
現在,如果我在MarketDataService
頂部添加@RequestMapping("/test")
,那么spring將注冊一個URL處理程序。
2018-05-28 15:20:31.320 INFO 31536 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/test/marketData],methods=[GET]}" onto public java.lang.String com.awesomecrypto.backend.service.MarketDataService.getMarketData()
我正在運行應用程序;
mvn清潔包裝
mvn spring-boot:運行
網絡上的所有示例都沒有提到這一點,並且看起來它不是類級別的RequestMapping,但我做不到。 感謝您的幫助。 謝謝!
您的@GetMapping
批注將被忽略,因為MarketDataService
類的頂部沒有@Controller
類型的批注。
在您的情況下,您應該使用@RestController (本身帶有@Controller
和@ResponseBody
注釋):
@RestController
public class MarketDataService {
@Autowired
private MarketDataRepository marketDataRepository;
@GetMapping("/marketData")
public String getMarketData() {
return "foobar";
}
}
在類上使用@RequestMapping
是將給定參數以及給定路徑參數傳遞給同一類中的子級映射。
例如,在類MarketDataService
上方添加@RequestMapping("/api")
意味着要觸發getMarketData()
方法的路徑將是/api/marketData
而不是/marketData
。
同樣,如果您添加@RequestMapping(value = "/api", produces = "application/json")
,它將把produces = "application/json"
參數傳遞給@GetMapping("/marketData")
。
當控制器用於對給定資源進行CRUD時,我經常在類上使用@RequestMapping
,例如:
@RestController
@RequestMapping("/marketData")
public class MarketDataService {
@Autowired
private MarketDataRepository marketDataRepository;
@PostMapping("")
public String createMarketData() {
// ...
}
@GetMapping("")
public String getAllMarketData() {
// ...
}
@GetMapping("/{id}")
public String getMarketDataById(@PathVariable Long id) {
// ...
}
@DeleteMapping("")
public String deleteAllMarketData() {
// ...
}
@DeleteMapping("/{id}")
public String deleteMarketDataById(@PathVariable Long id) {
// ...
}
// ...
}
您在類級別不需要RequestMapping。 將您的代碼更改為此,它將為您工作。
@RestController
public class MarketDataService {
@Autowired
private MarketDataRepository marketDataRepository;
@GetMapping("/marketData")
public String getMarketData() {
return "foobar";
}
}
我鼓勵您閱讀有關Spring MVC架構的更多信息。
https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc
您也可以閱讀用於RequestMapping的javaDocs,RestController。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.