Play Framework 2.3.4 - 如何在POST请求上调用Results.badRequest()并指向未通过路由映射的控制器中的方法?

时间:2014-10-17 10:55:17

标签: java playframework playframework-2.3

好的,我的标题有点难以理解。

我想要实现的目标如下。

我的控制器:

public static Result addSomething() {
    return getSomething(SOME_FORM);
}

public static Result addSomething(Form<SomeFormDetails> someForm) {
    // Do complicated stuff to get someObject and someOtherObject
    return ok(com.me.views.html.pages.AddSomething
            .render(someObject, someOtherObject, someForm));
}

public static Result postFromSomeForm() {
    Form<SomeFormDetails> filledForm = SOME_FORM.bindFromRequest();
    SomeFormDetails details = filledForm.get();
    // do some checks
    if (Database.addStuff(details)) {
        return redirect(com.me.controllers.routes.Get.index());
    } else {
        // #### THIS IS THE IMPORTANT BIT ####
        // this next line is not possible as I do not have the
        // method addSomething(Form<SomeFormDetails> someForm) mapped
        // in routes, but you get what I mean
        return badRequest(com.me.controllers.routes.Get.addSomething
                .render(filledForm));
        // #### THIS IS THE IMPORTANT BIT ####
    }
}

路由

GET     /something             com.me.controllers.Get.addSomething()
POST    /something/add         com.me.controllers.Get.postFromSomeForm()

我想避免做的是重复使用大量不必要的代码来获取someObject方法下的someOtherObjectpostFromSomeForm()个对象。

我知道我可以将// Do complicated stuff to get someObject and someOtherObject表示的位移动到另一个方法中,但由于这两个对象的性质并不简单。

我可以将addSomething(Form<SomeFormDetails> someForm)添加到路线中,如果我重命名(似乎不允许重载方法),但这不可取,因为它会导致很多其他问题。

我不能简单地将重要的位改为:

return badRequest(com.me.controllers.Get.addSomething.render(filledForm));

因为不支持(即没有使用reverseGet)。仅供参考{@ 1}}。

我非常确定我正在努力实现一些简单的事情,但是在使用这个框架时,由于从没有路由生成的所有reverseGet位,所以没有一个简单的方法可以实现它。与控制器方法相同的返回类型(我知道当然是这种情况并且理解它是必需的)

如果有一种简单的支持方式来实现我想要实现的目标,任何人都可以告诉我吗?如果这个问题没有意义,请告诉我。

1 个答案:

答案 0 :(得分:0)

您可以实现您想要的操作,只需使该操作返回渲染的模板而不是结果:

public static String addSomething(Form<SomeFormDetails> someForm) {
    // Do complicated stuff to get someObject and someOtherObject
    return com.me.views.html.pages.AddSomething
            .render(someObject, someOtherObject, someForm).body();
}

// latter
return badRequest(com.me.controllers.routes.Get.addSomething.render(filledForm));