gpt4 book ai didi

java - 有没有办法使用 playframework 接受路由中的自定义对象?

转载 作者:行者123 更新时间:2023-11-30 01:46:07 27 4
gpt4 key购买 nike

我想接受 post 请求的请求正文作为路由中的 User 对象。我使用的是 Play 版本 2.7.1

POST    /user/create    controllers.UserController.createUser(user : User)

我的用户对象如下所示。

public class User{
@NotNull
String userId;

@NotNull
String userName;

@NotNull
@NotEmpty
String userCity;
.
.
.
}

我的 createUser 方法如下所示。

public Result createUser(User user){
//do smething with user
}

编译时,出现错误,指出未找到:键入 User

我想接受这种方式的原因是使用 hibernate 验证来验证请求对象user,如下代码所示

public Result createUser(@Valid User user) {
//do smething with user
}

我已经研究过 PathBindable 和 QueryStringBindable。它们对我来说都没有用,因为用户不是路径参数或查询参数,而是发布请求

最后,我希望框架将请求正文转换为 User 对象并负责验证,而不是编写代码使用 Jackson 库将 Json 对象转换为 User 对象并使用 Javax Validator 验证 User 对象。

目前我正在使用以下函数进行反序列化和验证

public static <T> T deserialize(String json, TypeReference type) throws IOException {
ObjectMapper mapper = new ObjectMapper();
T bean = mapper.readValue(json, type);
validateBean(bean);
return bean;
}

public static <T> void validateBean(T bean) throws IOException {
for (ConstraintViolation violation : beanValidator.validate(bean)) {
throw new IOException(violation.getPropertyPath().toString() + " " + violation.getMessage());
}
}

最佳答案

首先,您要混合查询参数和请求正文。

您从路由文件传递的所有参数都是查询参数,controllers.UserController.createUser(user : User) 将尝试从查询参数中获取您的 User,但这只能在 PathBindable 的帮助下发生。由于您不通过查询传递用户,因此您的路线将如下所示:

POST    /user/create    controllers.UserController.createUser()

在您的 Controller 中,您将读取 POST 正文并解析收到的 json:

public Result createUser(Http.Request request) {
JsonNode json = request.body().asJson();
// Convert to java object and do what you want
return ok("It works");
}

关于java - 有没有办法使用 playframework 接受路由中的自定义对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57924364/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com