java - 没有类级请求映射,spring boot 注册 rest Controller 将无法工作

标签 java spring spring-boot

启动应用程序,但是,即使我的服务组件在 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);
        }
    }
}

市场数据服务

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 是在没有意义的 spring 上下文中注册的。这是相关的 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 clean package

mvn spring-boot:run

网络上的所有示例都没有提及这一点,看起来类级别的 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")

我看到 @RequestMapping 在 Controller 用于 CRUD 给定资源时经常在类上使用,例如:

@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) {
        // ...
    }

    // ...

}

关于java - 没有类级请求映射,spring boot 注册 rest Controller 将无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50574041/

相关文章:

java - 构建路径不完整。找不到 javax/servlet/ServletContext 的类文件

spring-boot - tomcat不在spring boot中创建访问日志

reactjs - 尝试以 pdf 形式查看数据,pdf 为空白

java - 设置按下 Tab 时 JComboBox 中的插入符位置

java - 试图了解什么是 Java 中的命名空间

java - Rundeck: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 必须首先发出 STARTTLS 命令

java - @Transactional 无法在 Spring Boot 中与 CrudRepository 一起工作

java - Google map v2 膨胀 XML 时出错

java - 大文件上传时ClientAbortException : java. io.IOException

java - 是否可以将 Spring Restdocs 与 Jersey 应用程序一起使用