无法在Springboot Rest Web项目中访问端点URL

时间:2020-10-23 07:39:13

标签: java spring-boot rest web

我已经在eclipse中初始化了SpringBoot Rest,并使其成为一个动态Web项目。遵循三轮胎原则,并且在控制器类中声明了端点URL。该项目可以很好地部署,但是一旦我尝试访问返回404错误的端点。请参考下面的例子。 二手编译器-Maven和服务器-apache tomcat 9.0

MainClass.java

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
@SpringBootApplication
@Configuration
public class PmsAdvanced extends SpringBootServletInitializer implements 
   WebMvcConfigurer{

public static void main(String[] args) {
    SpringApplication.run(PmsAdvanced.class, args);
}

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("/index.jsp");
    registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
}

}

样品控制器类

@RestController
@EnableWebMvc
@RequestMapping("/test")
public class PmsAdvancedController implements WebMvcConfigurer {

@PostMapping("/PMS")
public String sayHello(@RequestParam(value = "myName", defaultValue = "divi") String name) {
    return String.format("Hello %s!", name);
}

@GetMapping("/PMSA")
public String sayAge(@RequestParam(value = "age", defaultValue = "100") String age) {
    return String.format("I'm %s!", age);
}}

我一直尝试访问的URL-http:// localhost:8081 / pms_advance_be / test / PMSA enter image description here

1 个答案:

答案 0 :(得分:1)

如果将某些内容注释为@Configuration,那么您将告诉spring该类是@Beans的来源。因此,您不应在同一课程中使用@RequestMapping / @RestController / @GetMapping。将这些项目的相关部分分成另一类。

我也很确定您的设置不需要重复添加@EnableAutoConfiguration,并且可能只需要在根@SpringBootApplication注释旁边(如果有的话)(可能在旁边)也可以使用任何@SpringBootTest,但不要在此引用我)。如果您摆脱了它们并阅读了所有异常,那么您应该处于一个更好的位置才能使它正常工作。

在MVC风格的应用程序中(无论语言如何),典型的命名约定是所有请求均由名为“ BlahBlah ... Controller ”的类处理,处理传入的HTTP请求。

因此,总而言之,为了使此工作正常进行,我将开始:

  1. 删除所有开始于/等于@EnableAutoConfiguration的行
  2. PmsAdvancedController重命名为PmsAdvancedConfiguration,仅将方法addViewControllers保留在其中。
  3. @RestController删除@RequestMapping("/test")PmsAdvancedConfiguration
  4. 创建一个新类PmsAdvanceController,并在其中添加标记为@RequestMapping("/test")@GetMapping的注释@PostMapping方法
  5. @RestController组合了@Controller@ResponseBody-这不是必需的。删除。
  6. 我看不到您正在尝试使用WebMvcConfigurer做什么,但是我假设您正在按照“ Hello Worldiness”的判断来遵循某种示例...查看其他示例在线及其文档应与以下两个注释一起使用:@EnableWebMvc@Configuration可以删除所有其他注释。

编辑:

如果将以下内容放到一个Java文件中,然后运行main方法,它将起作用:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@SpringBootApplication
public class PmsAdvanced extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(PmsAdvanced.class, args);
    }
}

@Configuration
class PmsAdvancedConfiguration implements WebMvcConfigurer  {

    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("/index.jsp");
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    }
}

@RestController
@RequestMapping("/test")
class PmsAdvancedController {

    @PostMapping("/PMS")
    public String sayHello(@RequestParam(value = "myName", defaultValue = "divi") String name) {
        return String.format("Hello %s!", name);
    }

    @GetMapping("/PMSA")
    public String sayAge(@RequestParam(value = "age", defaultValue = "100") String age) {
        return String.format("I'm %s!", age);
    }
}

测试:

curl -X GET http://localhost:8080/test/PMSA?age=30

或在浏览器中访问:http://localhost:8080/test/PMSA?age=30

输出:

I'm 30!

注意:我实际上不是30岁。