2014-02-02 3 views
1

Я сейчас смотрю Play! Framework для Java, и я столкнулся с довольно любопытной ошибкой:Ошибка проверки формы Form Framework формы

я получил модель со следующими необходимыми полями (никаких других полей, кроме идентификатора)

@Lob 
@Constraints.Required 
private String content; 

@Constraints.Email 
@Constraints.Required 
private String email; 

@Constraints.Required 
private String title; 

У меня есть следующие методы в моем контроллере:

public static Result createEntry() { 
    Form<BlogEntry> filledForm = blogEntryForm.bindFromRequest(); 
    if (filledForm.hasErrors()) { 
     Logger.debug(filledForm.data().toString()); 
     Logger.debug(filledForm.errors().toString()); 
     return badRequest(newentry.render(filledForm)); 
    } 
    BlogEntry entry = filledForm.get(); 
    entry.save(); 
    return redirect(routes.BlogController.index()); 
} 

public static Result newEntry() { 
    return ok(newentry.render(blogEntryForm)); 
} 

И вид выглядит следующим образом:

@(blogform: Form[BlogEntry]) 
@import helper._ 

@main("New Blog Entry") { 
    @form(routes.BlogController.createEntry()) { 

     @if(blogform.hasErrors) { 
      Errors in form 
     } 
     <fieldset> 
      <div> 
      @inputText(blogform("email"), '_label -> "Email") 
      </div> 
      <div> 
      @inputText(blogform("title"), '_label -> "Title") 
      </div> 
      <div> 
      @inputText(blogform("content"), '_label -> "Content") 
      </div> 
      <button type="submit">Submit</button> 
     </fieldset> 
    } 
} 

Теперь, когда я навигации в форму в моем браузере и введите некоторые данные, затем нажмите «отправить», я перенаправляюсь к форме, поэтому была вызвана часть кода badRequest. Так что я начал протоколирование вывода обоего форм и проверок ошибок, и это вышло:

[отладка] приложение - {содержание = тест, название = тест, [email protected]}

[отлаживать ] application - {content = [ValidationError (content, error.required, [])], title = [ValidationError (title, error.required, [])], email = [ValidationError (email, error.required, []) ]}

Данные, безусловно, есть, и когда я перенаправлен в форму после отправки, поля по-прежнему заполняются правильными данными. Я пропустил что-то очевидное здесь?

ответ

3

Выяснил это сейчас: причина в том, что у меня не было сеттеров для полей в моей модели. Таким образом, форма не смогла установить свойства и не удалась.

+0

wow да, и мой друг имел тот же код в своем репо без геттеров и сеттеров, и он работал. Но он использовал Java 8, и я 7. Интересно, если бы это имело к этому какое-то отношение. –

0

Здравствуйте, я знаю, что прошло уже год с тех пор, как вы посмотрели на это, но у меня есть немного больше информации для тех, кто просто подходит к этому сейчас. При использовании 2.4.x и настройке ebeans я наткнулся на эту страницу: Play Enhancer. Усилитель воспроизведения - это маска байтового кода, которая позволяет использовать публичные поля и прямой доступ в проекте, но при построении фактически инкапсулирует поля.

При использовании Ebees ORM Play Enhancer включается по умолчанию. Это из файла plugins.sbt по умолчанию, который поставляется с Play! Применение:

// Play enhancer - this automatically generates getters/setters for public fields 
// and rewrites accessors of these fields to use the getters/setters. Remove this 
// plugin if you prefer not to have this feature, or disable on a per project 
// basis using disablePlugins(PlayEnhancer) in your build.sbt 
addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0") 

// Play Ebean support, to enable, uncomment this line, and enable in your build.sbt using 
// enablePlugins(SbtEbean). Note, uncommenting this line will automatically bring in 
// Play enhancer, regardless of whether the line above is commented out or not. 
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "1.0.0") 

Варианты иметь открытые поля и использовать их без добытчиков и пусть игра изменить его под капотом или использовать частные поля и определить свои собственные методы получения и установку.

Смежные вопросы