【问题标题】:Is there a way to accept custom object in the routes using playframework?有没有办法使用 playframework 在路由中接受自定义对象?
【发布时间】:2020-01-15 08:57:44
【问题描述】:

我想接受发布请求的请求正文作为路由中的用户对象。我正在使用 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
}

当我编译时,我收到一个错误提示 not found: type User

我想接受这种方式的原因是使用休眠验证来验证请求对象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());
        }
}

【问题讨论】:

    标签: java playframework routes sbt


    【解决方案1】:

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

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

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

    在您的控制器中,您将读取 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");
    }
    

    【讨论】:

    • 那么,你是说我们只能绑定路径参数或者查询参数?我们不能将请求正文绑定到路由吗?
    • 您可以将所有内容绑定到同一个查询,但在路由文件中您只能显示查询部分。游戏框架就是这样设计的
    猜你喜欢
    • 2016-09-13
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2023-02-15
    相关资源
    最近更新 更多