为相同的URL模式创建两个具有不同参数的方法。

13 浏览
0 Comments

为相同的URL模式创建两个具有不同参数的方法。

我有一个情景,其中一个名为"serachUser"的URL可能会带有两个不同的值(请求参数)userId或UserName。

为此,我创建了两个方法:

public String searchUserById(@RequestParam long userID, Model model)
public ModelAndView searchUserByName(@RequestParam String userName)

但是我遇到了模糊映射异常。Spring能处理这种情况吗?

0
0 Comments

在上述代码中,我们可以看到一个用于搜索用户的方法,该方法允许接收两个参数:userID和userName。在该方法中,我们检查了userID是否为null,如果不为null,则执行一些操作,否则执行其他操作。

然而,这种实现方式存在一个问题:当userID和userName都为null时,无法区分是因为两个参数都没有传递值,还是只是其中一个参数没有传递值。

为了解决这个问题,我们需要创建两个方法,它们具有相同的URL模式但不同的参数。这样,当我们只传递userID时,将调用第一个方法;当我们只传递userName时,将调用第二个方法;当两个参数都传递时,将根据需要调用相应的方法。

以下是解决方案的代码示例:

// 方法1:接收userID参数

@RequestMapping(value = "/searchUser", params = "userID")

public String searchUserByID(long userID, Model model) {

// 执行相关操作

return "result";

}

// 方法2:接收userName参数

@RequestMapping(value = "/searchUser", params = "userName")

public String searchUserByName(String userName, Model model) {

// 执行相关操作

return "result";

}

通过创建两个具有不同参数的方法,我们可以根据传递的参数调用相应的方法。这样,无论是传递userID还是userName,我们都可以正确地执行相应的操作。这种方法可以帮助我们解决在同一URL模式下使用不同参数的问题。

0
0 Comments

问题出现的原因是在同一个URL模式下,有两个不同的方法需要使用不同的参数。解决方法是使用params参数来根据HTTP参数进行过滤。另一种处理方法是将参数作为字符串接受,然后调用Long.parseLong()方法进行解析,如果解析成功,则为userID,如果解析失败,则假设为用户名。如果有多个参数,可以使用params = { "参数1", "参数2" }来处理。如果URL映射和其他参数都相同,是否会在部署时出现异常,还可以为该URL分配不同的角色/功能进行授权。与此相关的是,Swagger可能不完全支持这一点。关于这个问题可以在github.com/springfox/springfox/issues/1828找到。URL应该包含userID关键字,Spring使用它进行匹配。如果调用/searchUser?userID=abc&userName=xyz,哪个控制器将被调用?如果传入的请求有一个可以映射到两种类型的DTO的JSON主体,Spring是否有一些机制来区分它们?对此我也很感兴趣,你找到了什么解决方法?很抱歉,到目前为止,我认为我必须传递一个额外的参数来区分它们。没有看到其他解决方法。

0