首页 > 解决方案 > 无法在 Springboot Rest web 项目中访问端点 URL

问题描述

我已经在 Eclipse 中初始化了一个 SpringBoot Rest 并使其成为一个动态 Web 项目。遵循 3-tire 原则,并在控制器类中声明端点 URL。该项目部署良好,但一旦我尝试访问返回 404 错误的端点。请参考以下示例。使用的编译器 - Maven 和服务器 - apache tomcat 9.0

主类.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 在此处输入图像描述

标签: javaspring-bootrestweb

解决方案


如果您注释某些内容,@Configuration那么您就是在告诉 spring 该类是@Beans. 因此,您不应该在同一个类中拥有@RequestMapping// @RestController@GetMapping将这些项目的相关部分分成另一个类。

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

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

因此,总而言之,要使其正常工作,我将从:

  1. 删除所有开始/等于的行@EnableAutoConfiguration
  2. 仅将方法重命名PmsAdvancedControllerPmsAdvancedConfiguration并保留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 岁。


推荐阅读