【问题标题】:Spring Boot Rest api not producing json errorSpring Boot Rest api不产生json错误
【发布时间】:2022-01-29 15:44:12
【问题描述】:

我正在尝试在我的 Rest API 中实现错误处理并使用邮递员进行测试,当我给出不正确的路径时邮递员返回 404 但它是 404 HTML。

有人告诉我,默认情况下 spring boot 应该返回类似这样的东西

{
  "timestamp": 1436442596410,
  "status": 404,
  "error": "Not Found",
  "message": "No message available",
  "path": "/item"
}

我给它的不存在的路径是

http://localhost:8080/Assignment2C/breweriessdfsdf

我得到的回应是

    <!doctype html>
<html lang="en">

<head>
    <title>HTTP Status 404 – Not Found</title>
    <style type="text/css">
        h1 {
            font-family: Tahoma, Arial, sans-serif;
            color: white;
            background-color: #525D76;
            font-size: 22px;
        }

        h2 {
        font-family: Tahoma, Arial, sans-serif;
        color: white;
        background-color: #525D76;
        font-size: 16px;
    }

    h3 {
        font-family: Tahoma, Arial, sans-serif;
        color: white;
        background-color: #525D76;
        font-size: 14px;
    }

    body {
        font-family: Tahoma, Arial, sans-serif;
        color: black;
        background-color: white;
    }

    b {
        font-family: Tahoma, Arial, sans-serif;
        color: white;
        background-color: #525D76;
    }

    p {
        font-family: Tahoma, Arial, sans-serif;
        background: white;
        color: black;
        font-size: 12px;
    }

    a {
        color: black;
    }

    a.name {
        color: black;
    }

    .line {
        height: 1px;
        background-color: #525D76;
        border: none;
    }
</style>
</head>

    <body>
    <h1>HTTP Status 404 – Not Found</h1>
    <hr class="line" />
    <p><b>Type</b> Status Report</p>
    <p><b>Description</b> The origin server did not find a current representation for the target resource or is not
        willing to disclose that one exists.</p>
    <hr class="line" />
    <h3>Apache Tomcat/9.0.26</h3>
</body>

</html>

我使用的 spring boot 依赖是

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.2.6.RELEASE</version>
    <type>pom</type>
    <scope>provided</scope>
</dependency>

我的控制器类是 breweries_Controller

  @RestController
@RequestMapping("/breweries")
public class Breweries_Controller {

    @Autowired
    Breweries_Service service;

    @GetMapping(produces = MediaTypes.HAL_JSON_VALUE)
    public Resources<Breweries> getAllBreweries(@RequestParam(name = "limit", required = false) Integer limit , @RequestParam(name = "offset", required = false) Integer offset) {

        List<Breweries> allBreweries = service.getAllBreweries();

        if(limit == null && offset == null){
            limit = 20;
            offset = 0;
        }
        List<Breweries> paginatedList = allBreweries.subList(offset, offset + limit);

        for (Breweries b : allBreweries) {
            int id = b.getResourceId();
            Link self = linkTo(this.getClass()).slash(id).withSelfRel();
            b.add(self);
            linkTo(methodOn(this.getClass()).getBrewerie(id));
        }
        Link link = linkTo(this.getClass()).withSelfRel();
        Resources<Breweries> result = new Resources<Breweries>(paginatedList, link);

        return result;

    }

    @GetMapping(value = "/{id}", produces = MediaTypes.HAL_JSON_VALUE)
    public Resource<Breweries> getBrewerie(@PathVariable("id") int id) {
        Resource<Breweries> brewerie = new Resource<Breweries>(service.getBrewerieById(id));
        ControllerLinkBuilder linkTo = linkTo(methodOn(this.getClass()).getAllBreweries(5, 50));
        brewerie.add(linkTo.withRel("all-breweries"));
        return brewerie;
    }

    @DeleteMapping(value = "/{id}")
    @ResponseStatus(HttpStatus.OK)
    public void delete(@PathVariable("id") int id) {
        Breweries brewerie = service.getBrewerieById(id);
        service.deleteBrewerie(brewerie);
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public void create(@RequestBody Breweries b) {
        b.setResourceId(0);
        b.setAddUser(0);
        b.setLastMod(new Date());
        service.addBrewerie(b);
    }

    @PutMapping(value = "/{id}")
    @ResponseStatus(HttpStatus.OK)
    public void update(@PathVariable("id") int id, @RequestBody Breweries b) {
        b.setResourceId(id);
        b.setAddUser(0);
        b.setLastMod(new Date());
        service.editBrewerie(b);
    }
}

【问题讨论】:

  • 请添加您的控制器类。您正在等待来自 Spring Boot 控制器的响应,但您的请求似乎从未到达其中一个
  • @CodeScale 我已将控制器类添加到问题中
  • @GreyWolf18 你可以尝试使用上面提到的请求映射访问服务器,如 localhost://breweries/noroute 控制器。如果这不起作用,您还可以添加一个接受标头,其类型与 Postman 的发布请求中的类型相同。

标签: spring spring-boot rest error-handling postman


【解决方案1】:

请检查您的控制器类是否在源包中(存在@SpringBootApplication 的类的包)。如果没有,请添加 @ComponentScan 注释和 @SpringBootApplication 以确保正在扫描您的控制器类以查找端点。这对我来说常常是个问题!

【讨论】:

    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 2020-04-12
    • 2019-07-26
    • 2017-06-27
    • 2018-07-15
    • 2023-03-06
    • 2019-09-26
    • 1970-01-01
    相关资源
    最近更新 更多