当前位置: 首页 > 知识库问答 >
问题:

在spring rest中验证可选@Requestparam

庾鸿飞
2023-03-14

我有一个请求,比如http://example.com?value=xyz我必须为此编写GET。要求是,当我有一个值时,响应必须是来自数据库的特定记录“xyz”。但是如果请求是http://example.com即没有值,它必须从数据库中检索所有值。

为了实现这一点,我在请求中加入了(@RequestParam(value=“name”,required=false)字符串名)。i、 e将该值标记为可选

但问题是当我的请求是http://example.com?value=也就是说,如果没有值,我必须将“request is invalid”作为错误抛出,并且不能从数据库中检索所有值。但在我的例子中,当我将参数标记为可选时,它会从数据库中检索所有记录。

有没有办法对可选的请求参数进行验证?

共有2个答案

卢出野
2023-03-14

您可以检查您的控制器中的查询字符串,这应该工作:

if (request.getQueryString() != null) {
   if (value.isPresent() || request.getQueryString().contains("value")){
    if (!value.isPresent()){
        // Throw your error
    }
  }
}

上面的代码将首先检查值是否存在,或者url/查询字符串包含单词“值”,如果两者都为真,它将命中下一个if语句。然后您可以检查值是否不存在。如果不是,这意味着有人给你发了http://example.com?value=,你可以抛出一个错误。

权玉泽
2023-03-14

如果您想坚持使用查询字符串样式,可以为http://example.com和其他带有required=true的forhttp://example.com?value=xyz。您仍然可以使用单独的公共私有方法重用大部分代码。

然而,

如果您可以将url模式更改为使用路径变量,它将变得更可读、更清晰。

@GetMapping(path={"/", "/value/{value}")
public void method(@PathVariable(name = "value", required = false) String value){
  // Your code
}

然后你可以像这样查询这个endpoint

  • http://example.com

 类似资料:
  • 我有以下请求json 我试图验证这个json,我的要求是,如果ParameterB存在,那么里面肯定会有一个列表shd存在,否则ParameterB是可选的。例如,如果ParameterB本身只是不存在,那么shd不是一个问题。 我正在寻找相同的java验证注释。我在key和value上使用了@NotNull,但不能决定在ParameterB上使用什么,因为它是list所在的数组 我在Parame

  • 我有一个DTO,有几个字段,用户名,密码和电子邮件所有这些字符串。 我也有一个列表,我想作为一个可选的,这意味着它不必从表单中传递,可以留空。 这应该在前端有效: 因此,我们应该: javax中是否有@OptionalField注释之类的内容。验证。限制? 还是我唯一的选择是两个独立的DTO?

  • 问题内容: 我有一条路由,需要经过身份验证和未经身份验证的用户使用。我用来启用身份验证,但是它可以防止任何未经身份验证的用户访问路由(正常)。 如何允许未经身份验证的用户也访问路由? 似乎没有可以传递给我的护照策略中的选项。 问题答案: 您可以通过扩展现有实例来创建自己的实例: 然后在您的控制器上使用此代码:

  • 我正在尝试使用Keycloak配置Spring Boot应用程序以使其具有可供经过身份验证和未经身份验证的用户访问的endpoint。对于经过身份验证的用户,我想返回一些额外信息。这是我试图实现的一个简单示例: application.properties: 到目前为止,我只对这两种情况中的一种起作用。如果我使用上面的安全约束保护endpoint,那么只有经过身份验证的用户才能访问该endpoin

  • 我正在用java编写一个必须在我的工作环境中运行的程序。这是我的代码片段: 在我的家庭网络上,这工作得非常好,但在商业网络上,我会遇到以下错误: onnection.getSocketException:软件导致连接中止:recv在java.net.SocketInputSonquerer.runRead0(本机方法)在onquerer.java:44SocketInputStream.read(