簡體   English   中英

沒有類級別的請求映射,Spring Boot注冊Rest控制器不起作用

[英]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。

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/RestController.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM