Spring引导应用程序中的RESTAPI并没有抛出错误的请求,尽管我正在传递输入POJO的错误属性

Spring引导应用程序中的RESTAPI并没有抛出错误的请求,尽管我正在传递输入POJO的错误属性,spring,rest,maven,spring-mvc,spring-boot,Spring,Rest,Maven,Spring Mvc,Spring Boot,这是我的REST API: @RequestMapping(value="/test1") public String test1(@RequestBody TestPOJO tpj) { if(tpj instanceof TestPOJO) { System.out.println("Correct data format passed "); } return "working1"; } 这是TestPOJO的结构: public class T

这是我的REST API:

@RequestMapping(value="/test1")
public String test1(@RequestBody TestPOJO tpj) {
    if(tpj instanceof TestPOJO) {
        System.out.println("Correct data format passed ");
    }
    return "working1";

}
这是TestPOJO的结构:

public class TestPOJO {

    private String x;
    private String y;


    public String getX() {
        return x;
    }
    public void setX(String x) {
        this.x = x;
    }
    public String getY() {
        return y;
    }
    public void setY(String y) {
        this.y = y;
    }   
}
在POSTMAN客户端中,我将此requestbody传递给此API:

{
"sd":"u",
"egergdrg":34
}
它的打印“通过了正确的数据格式”。为什么将此输入结构作为“TestPOJO”的实例。我在体内传递完全不同的属性,即使数据类型不同。它不是应该给出400个错误请求吗?为什么它能成功运行如何验证所有传入请求正文是否具有与输入参数类似的正确结构,如果没有,则返回400错误?


在pom.xml中添加的供参考的依赖项有“spring boot starter web”、“spring boot starter测试”、“spring boot开发工具”。

您可以验证请求主体。只需像这样注释您的请求正文
@Valid@RequestBody TestPOJO tpj
,然后在您的POJO类中,向字段添加以下注释:

@Size(最小值=5,最大值=5)
私有字符串x

这将实际检查字符串x的长度

您可以使用更多注释,依赖于
javax.annotation
包。
请记住,您需要一个注释处理器才能使其工作,例如,
hibernate验证程序注释处理器

您可以验证您的请求正文。只需像这样注释您的请求正文
@Valid@RequestBody TestPOJO tpj
,然后在您的POJO类中,向字段添加以下注释:

@Size(最小值=5,最大值=5)
私有字符串x

这将实际检查字符串x的长度

您可以使用更多注释,依赖于
javax.annotation
包。
请记住,您需要一个注释处理器才能使其工作,例如,
hibernate验证程序注释处理器

您可以在Spring官方网站上参阅本教程

我对您的源代码进行了如下修改,并使用Postman对其进行了测试,现在它将返回400(错误请求)。我不认为它应该返回401错误的输入数据

您的TestPOJO:

public class TestPOJO {
    @NotNull
    private String x;

    @NotNull
    private String y;


    public String getX() {
        return x;
    }
    public void setX(String x) {
        this.x = x;
    }
    public String getY() {
        return y;
    }
    public void setY(String y) {
        this.y = y;
    }   
}
您的REST API:

@RequestMapping(value="/test1")
public String test1(@Valid @RequestBody TestPOJO tpj) {
    if(tpj instanceof TestPOJO) {
        System.out.println("Correct data format passed ");
    }
    return "working1";

}

顺便说一句,一旦您将
spring boot starter web
的依赖项添加到pom文件中,就会自动添加
hibernate验证程序。

您可以在spring官方网站上参考本教程

我对您的源代码进行了如下修改,并使用Postman对其进行了测试,现在它将返回400(错误请求)。我不认为它应该返回401错误的输入数据

您的TestPOJO:

public class TestPOJO {
    @NotNull
    private String x;

    @NotNull
    private String y;


    public String getX() {
        return x;
    }
    public void setX(String x) {
        this.x = x;
    }
    public String getY() {
        return y;
    }
    public void setY(String y) {
        this.y = y;
    }   
}
您的REST API:

@RequestMapping(value="/test1")
public String test1(@Valid @RequestBody TestPOJO tpj) {
    if(tpj instanceof TestPOJO) {
        System.out.println("Correct data format passed ");
    }
    return "working1";

}

顺便说一句,一旦您将
springbootstarterweb
的依赖项添加到pom文件中,就会自动添加
hibernate验证器

它会引发异常吗?请求是完全有效的,既然您不想以不同的方式处理这些参数(过滤器、拦截器、侦听器或其他任何方式),该如何处理呢。它只是看到您没有任何绑定属性,因此您将得到一个空对象。@M.Deinum明白您的意思。那么,我如何解释/验证传入的API请求的格式是否正确,即与我的输入pojot的结构类似这是因为Spring将为您创建新实例,无论它是否存在于请求或编号中。@Antoniossss是否建议如何验证输入结构并在输入结构不正确时返回错误代码401invalid@Antoniossss我已经尝试过了,它以同样的方式工作,wy应该抛出异常吗?请求是完全有效的,既然您不想以不同的方式处理这些参数(过滤器、拦截器、侦听器或其他任何方式),该如何处理呢。它只是看到您没有任何绑定属性,因此您将得到一个空对象。@M.Deinum明白您的意思。那么,我如何解释/验证传入的API请求的格式是否正确,即与我的输入pojot的结构类似这是因为Spring将为您创建新实例,无论它是否存在于请求或编号中。@Antoniossss是否建议如何验证输入结构并在输入结构不正确时返回错误代码401invalid@Antoniossss我已经试过了,它的工作原理是一样的