読者です 読者をやめる 読者になる 読者になる

Optional の orElseThrow を使う

Wicket を Java8 で書くようになったせいなのか、Wicket のバリデータを書くのが嫌にになってきた。
たしかにバリデータを書いてセットして、Form の onError が call される方式は、
入力項目が少ない場合に手軽で良いと思う。でも項目が多くて Form のonSubmit と離れた場所でバリデータを書くのが読みにくくなってくる。

短いコードではないけど、以下のような書き方も魅力的だ。

queue(new TextField<String>("value", new Model<String>()));
queue(new Form("form"));

FeedbackPanel feedbackPanel = new FeedbackPanel("feedback");
feedbackPanel.setOutputMarkupId(true);
queue(feedbackPanel);

queue(new AjaxButton("send"){
   @Override
   protected void onSubmit(AjaxRequestTarget target, Form<?> form){
      target.prependJavaScript("$('#name').removeClass('input-error');");
      Optional<String> valueOptional = Optional.ofNullable(((TextField<String>)form.get("value")).getModelObject());
      try{
         int value = Integer.parseInt(valueOptional.orElseThrow( ()->new NullPointerException("値が未入力")));
         // 数値として受信した処理を実行
      }catch(NullPointerException e){
         error(e.getMessage());
         target.appendJavaScript("$('#name').addClass('input-error');");
      }catch(Exception e){
         error("数値を入れてください。");
         target.appendJavaScript("$('#name').addClass('input-error');");
      }finally{
         target.add(feedbackPanel);
      }
   }
});

error(String) を実行することで FeedbackPanel にメッセージを表示する。
CSSには、以下を記述しておく。
.input-error{
   background-color: #ffc7c7;
}
ul.feedbackPanel{ list-style: none; padding: 2px 2px; }

Wicket は、ulタグで FeedbackPanle を feedbackPanel クラスで書くからだ