0

更新で JSON リクエストの必須フィールドが指定されていない場合に、Play が不平を言うのをやめさせようとしています。必須フィールドには、変更したくない値が既に含まれているため、再度指定する必要はありません。

簡素化されたモデル:

@Entity
public class Run extends Model {
    public enum Status { RUNNING, OK, WARNINGS, ERRORS, FAILED, CERTIFIED };

    @Id
    public Long id;

    @Constraints.Required
    @ManyToOne(cascade = CascadeType.REFRESH)
    public Task task;

    @JodaDateTime
    @Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")
    public DateTime started;
    @JodaDateTime
    @Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")
    public DateTime completed;

    @Enumerated(EnumType.STRING)
    @Column(columnDefinition="ENUM('OK','WARNINGS','ERRORS','RUNNING','FAILED','CERTIFIED')")
    public Status result;

}

サンプル アプリケーションの 1 つに基づいて、最初のコントローラー アクションは次のとおりです。

@Transactional
@BodyParser.Of(play.mvc.BodyParser.Json.class)
public static Result update(Long run_id) {
    Form<Run> runForm = form(Run.class).bindFromRequest();
    if(runForm.hasErrors()) {
        return badRequest(runForm.errorsAsJson());
    }
    runForm.get().update(run_id);

    ObjectNode result = Json.newObject();
    result.put("id", run_id);

    return ok(result);
}

しかし、私がそれを送信しただけでは、それが必要{ completed: '1341268791000', result: 'ERRORS }であると不平を言いtaskます。

それから私はおそらくそれForm.fillを修正するために使用できると思いました:

@Transactional
@BodyParser.Of(play.mvc.BodyParser.Json.class)
public static Result update(Long run_id) {
    Run run = Run.find.byId(run_id);
    Form<Run> runForm = form(Run.class).fill(run).bind(request().body().asJson());

    if (runForm.hasErrors())
        return badRequest(runForm.errorsAsJson());

    runForm.get().update(run_id);

    ObjectNode result = Json.newObject();
    result.put("id", run_id);

    return ok(result);
}

しかし、それも役に立ちませんでした。秘密は何ですか?

4

1 に答える 1

0

フィールドを挿入/更新するためにフォームを使用する必要はありません。フィールドを「手動で」更新することもできます(単純化されたサンプル、もちろん、あなたの例では Json から someField を抽出する必要があります

public static Result update(Long run_id) {
    Run run = Run.find.byId(run_id);
    run.someField = form().bindFromRequest().get("someField");
    run.update();
    return ok();
}
于 2012-07-02T23:41:03.380 に答える