0

助けてくれてありがとう。

JSR 303 で検証中のフォームがあります。検証が失敗した後、コントローラーはフォームを返し、検証エラーを表示し、フォームを元の値でレンダリングします。これは、複数選択要素を除くすべてのタイプのフォーム要素でうまく機能します。

コマンド オブジェクト:

public class TaskOrder implements Serializable {
   private static final long serialVersionUID = 1L;

   ...

   @XmlTransient
   @ManyToMany
   @<OtherJPAAnnotations...>
   private List<Contractor> subcontractors;

   ...

}

請負業者クラス:

public class Contractor implements Serializable {
   private static final long serialVersionUID = 1L;

   @Id
   @GeneratedValue(strategy=GenerationType.IDENTITY)
   @<OtherJPAAnnotations...>
   private Integer id;

   @<OtherJPAAnnotations...>
   private String name;

}

コントローラ:

@RequestMapping(value="processingPath", method=RequestMethod.POST)
public String createNewTaskOrder(@Valid @ModelAttribute TaskOrder taskOrder,
   BindingResult result,
   Model model) {

   ...

   if (!result.hasErrors()) {

      //No binding errors, lots of processing...

   else {

      model.addAllAttributes(result.getModel());
      model.addAttribute(taskOrder);

      model.addAttribute("subs", myDAOInstance.getSubs());

      return this.setupNewTaskOrder(model);

   }

}

@RequestMapping("getFormPath")
public String setupNewTaskOrder(Model model) {

   if (!model.containsAttribute("taskOrder")) {

      TaskOrder taskOrder = new TaskOrder();
      taskOrder.setId(0);
      model.addAttribute(taskOrder);

   }

   return "_n/admin/taskOrder/new";

}

フォーム:

<form:form commandName="taskOrder" action="processPath">

   ...

   <form:select path="subcontractors">
      <form:options items="${subs}" itemValue="id" itemLabel="name"/>
   </form:select>

   ...

</form>

同じフォームで既存の「TaskOrder」を開くと、「下請け業者」の複数選択で値が選択されます。

ただし、新しい「TaskOrder」を追加しようとすると、検証から戻ったときに値が選択されていません。選択した値がモデルにアタッチされて返されていることはわかっていますが、選択要素で選択されていません。

助けてくれてありがとう!

4

1 に答える 1

0

助けてくれてありがとう。ビジュ…正解でした!

この問題に出くわす可能性がある人のために、ここで説明する「EqualsUtil」クラスをプロジェクトに追加しました: http://www.javapractices.com/topic/TopicAction.do?Id=17

次に、Contractor クラスに次のメソッドを追加しました。

@Override
public boolean equals(Object o) {

   if (this == o) return true;
   if (!(o instanceof Contractor)) return false;

   Contractor c = (Contractor) o;

   //Here I ignore the other properties since "id" and "name" are what
   //I'm primarily concerned with...
   return EqualsUtil.areEqual(this.name, c.name) &&
        EqualsUtil.areEqual(this.id, c.id);

}
于 2012-06-07T13:32:21.773 に答える