【问题标题】:Rest Controller returns 404 on base pathRest Controller 在基本路径上返回 404
【发布时间】:2021-04-15 03:01:48
【问题描述】:

我正在尝试使用 Spring Boot 制作一个 REST API。当我执行“http://localhost:8080/foo/*”时,我得到了我想要的,但是当我使用“http://localhost:8080/api/foo/*”时,我得到 404 错误。我有其他几乎相同的控制器,它们工作得很好。我尝试过使用@RequestMapping,但没有任何改变。 application.properties:

.
.
spring.data.rest.base-path=/api

控制器:

@RestController
public class FooController {
    @Autowired
    private FooRepository fooRepository;
    
    @GetMapping("/foo")
    public List<Foo> retreiveAllFoos(){
        return fooRepository.findAll();
    }
    
    @GetMapping("/foo/{id}")
    public Foo retrieveFoo(@PathVariable int id) {
        Optional<Foo> foo = fooRepository.findById(id);
        return foo.get();
    }
    
    @DeleteMapping("/foo/{id}")
    public void deleteFoo(@PathVariable int id) {
        fooRepository.deleteById(id);
    }
    
    @PostMapping("/foo")
    public ResponseEntity<Object> createFoo(@RequestBody Foo foo){
        Foo savedFoo = fooRepository.save(foo);
        
        
        URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}")
                .buildAndExpand(savedFoo.getId()).toUri();
        return ResponseEntity.created(location).build();
    }
    
    @PutMapping("/foo/{id}")
    public ResponseEntity<Object> updateFoo(@RequestBody Foo foo, @PathVariable int id){
        Optional<Foo> fooOptional = fooRepository.findById(id);
        
        if(!fooOptional.isPresent()) {
            return ResponseEntity.notFound().build();
        }
        
        foo.setId(id);
        
        fooRepository.save(foo);
        
        return ResponseEntity.noContent().build();
    }
}

【问题讨论】:

    标签: java spring-boot spring-mvc spring-restcontroller


    【解决方案1】:

    正确的属性是spring.data.rest.basePath,所以你想要application.properties中的以下内容:

    spring.data.rest.basePath=/api
    

    见https://docs.spring.io/spring-data/rest/docs/current/reference/html/#getting-started.changing-base-uri

    【讨论】:

    • 我换了,但问题仍然存在。
    • 你使用的是什么版本的 Spring Boot?
    • 我使用的是 2.4.1 版本。
    【解决方案2】:

    在application.properties 中包含以下内容:

    server.servlet.context-path=/api
    

    但是,默认情况下,这将使它成为应用程序中所有端点的根

    另外,一旦你包含 @RequestMapping 注释,你是为整个控制器还是为每个方法的头设置这个?

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 2022-12-10
      • 2018-02-27
      • 1970-01-01
      相关资源
      最近更新 更多