rest-controller-tyr减少了带有参数的端点的数量,但是得到了不明确的Map错误

bfnvny8b  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(222)

我想在spring中实现一些简单的端点,尽可能多地使用restful并减少要使用的url的数量。下面是我想调用的get url:(这是一个简化版本)

GET /users
GET /users?id=123
GET /users?username=xyz

我用了这个控制器:

@GetMapping()
public @ResponseBody
OutputUserDTO getUserByParameter(@RequestParam(required = false) String id,
                                 @RequestParam(required = false) String username) {
    if (id != null && !id.isEmpty()) {
        return userService.getUserById(id);
    }
    if (username != null && !username.isEmpty()) {
        return userService.getUserByUsername(username);
    }

    throw new MissingParameterException("...some message...");
}

@GetMapping()
public @ResponseBody
List<OutputUserDTO> getUsers() {
    return userService.getUsers();
}

当然,我得到了一个错误,那就是模糊Map。
我想总是返回一个列表,这样我就可以合并两个端点,如果你传递一些参数,返回一个单例。。。尽管我不知道这是不是正确的做法。或者,为每个参数创建一个端点,get/users/{userid},get/users/{username}。。。但我也不喜欢它(如果我有10种不同的方法来获取用户,那么我必须实现10个端点:s)
在这种情况下有什么好的做法??谢谢。

jbose2ul

jbose2ul1#

替换 MissingParameterExceptionreturn userService.getUsers(); ,然后去掉另一个方法,你知道的,和第一个方法有完全相同Map的方法。
要实现这一点,您必须将返回类型更改为object,这不会是问题,因为实际返回的对象控制了 @ResponseBody ,而不是声明的类型。

@GetMapping()
@ResponseBody
public Object getUserByParameter(@RequestParam(required = false) String id,
                                 @RequestParam(required = false) String username) {
    if (id != null && ! id.isEmpty()) {
        return userService.getUserById(id);
    }
    if (username != null && ! username.isEmpty()) {
        return userService.getUserByUsername(username);
    }
    return userService.getUsers();
}

仅供参考: @ResponseBody 是一个方法级注解,因此它应该列在任何关键字修饰符之前。
java语言规范,第8.3.1节。字段修饰符,表示:
字段修饰符:
  (其中之一)
  注解 public protected private  
static final transient volatile [...]
如果一个字段声明中出现两个或多个(不同的)字段修饰符,则通常(尽管不是必需的)它们的出现顺序与上面在fieldmodifier的production中显示的顺序一致。

os8fio9y

os8fio9y2#

它应该类似于各自方法上的@getmapping(“/users”)
http://www.appsdeveloperblog.com/pathvariable-spring-mvc/

92vpleto

92vpleto3#

我想原因是,在getuserbyparameter中,两个参数都是可选的,但是如果两个参数都没有传递,它将与第二个getmapping冲突。
此外,返回的内容在这三种场景中也发生了变化。场景1返回dto列表,而场景2和3返回单个dto
我不认为您可以使用您的请求路径/用户来处理所有三种情况,除非您想将一个dto Package 到一个列表中,在这种情况下,您可以简单地合并两个方法。当两个参数都丢失时调用getusers(),在其他情况下,执行当前所做的操作,但将响应 Package 在一个列表中。
如果您想将它们分开并返回dto或list,您可能应该通过在方法1上指定@getmapping(“/user”)和在方法2上指定@getmapping(“/users”)将它们分开为/users和/user
希望这有帮助

相关问题