我想在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)
在这种情况下有什么好的做法??谢谢。
3条答案
按热度按时间jbose2ul1#
替换
MissingParameterException
与return userService.getUsers();
,然后去掉另一个方法,你知道的,和第一个方法有完全相同Map的方法。要实现这一点,您必须将返回类型更改为object,这不会是问题,因为实际返回的对象控制了
@ResponseBody
,而不是声明的类型。仅供参考:
@ResponseBody
是一个方法级注解,因此它应该列在任何关键字修饰符之前。java语言规范,第8.3.1节。字段修饰符,表示:
字段修饰符:
(其中之一)
注解
public
protectedprivate
static
final
transientvolatile
[...]如果一个字段声明中出现两个或多个(不同的)字段修饰符,则通常(尽管不是必需的)它们的出现顺序与上面在fieldmodifier的production中显示的顺序一致。
os8fio9y2#
它应该类似于各自方法上的@getmapping(“/users”)
http://www.appsdeveloperblog.com/pathvariable-spring-mvc/
92vpleto3#
我想原因是,在getuserbyparameter中,两个参数都是可选的,但是如果两个参数都没有传递,它将与第二个getmapping冲突。
此外,返回的内容在这三种场景中也发生了变化。场景1返回dto列表,而场景2和3返回单个dto
我不认为您可以使用您的请求路径/用户来处理所有三种情况,除非您想将一个dto Package 到一个列表中,在这种情况下,您可以简单地合并两个方法。当两个参数都丢失时调用getusers(),在其他情况下,执行当前所做的操作,但将响应 Package 在一个列表中。
如果您想将它们分开并返回dto或list,您可能应该通过在方法1上指定@getmapping(“/user”)和在方法2上指定@getmapping(“/users”)将它们分开为/users和/user
希望这有帮助