2012-11-20 20 views
9

Spring MVCを初めて使用しています。 Spring、Spring MVC、JPA/Hibernateを使用するアプリケーションを作成しています Spring MVCにモデルオブジェクトへのドロップダウンから値を設定する方法がわかりません。 Customer.javaSpring MVCでのドロップダウン値のバインド

@Entity 
public class Customer { 
    @Id 
    @GeneratedValue 
    private Integer id; 

    private String name; 
    private String address; 
    private String phoneNumber; 

    //Getters and setters 
} 

invoice.jsp

<form:form method="post" action="add" commandName="invoice"> 
    <form:label path="amount">amount</form:label> 
    <form:input path="amount" /> 
    <form:label path="customer">Customer</form:label> 
    <form:select path="customer" items="${customers}" required="true" itemLabel="name" itemValue="id"/>     
    <input type="submit" value="Add Invoice"/> 
</form:form> 

Invoice.java

​​

:私はこの非常に一般的なシナリオここで

想像することができ、コードであります

InvoiceCon InvoiceControler.addInvoice()が呼び出されtroller.java

@Controller 
public class InvoiceController { 

    @Autowired 
    private InvoiceService InvoiceService; 

    @RequestMapping(value = "/add", method = RequestMethod.POST) 
    public String addInvoice(@ModelAttribute("invoice") Invoice invoice, BindingResult result) { 
     invoiceService.addInvoice(invoice); 
     return "invoiceAdded"; 
    } 
} 

、請求書インスタンスは、パラメータとして受領。請求書の金額は予想通りですが、顧客インスタンスの属性はNULLです。これは、httpポストが顧客IDを送信し、InvoiceクラスがCustomerオブジェクトを要求するためです。私はそれを変換する標準的な方法は何か分かりません。

Spring Type変換について(http://static.springsource.org/spring/docs/current/spring-framework-reference/html/validation.html)、Controller.initBinder()について読んでいますが、それがこの問題の解決策であるかどうかはわかりません。

アイデア?

+3

私はそれが<フォーム置き換え働かせた:選択パス= "お客様の" .. ./>

答えて

7

すでに触れたように、このトリックは、idからドロップダウンをカスタムインスタンスに変換するカスタムコンバータを登録することです。

あなたはこのようにカスタムコンバータを書くことができます。

public class IdToCustomerConverter implements Converter<String, Customer>{ 
    @Autowired CustomerRepository customerRepository; 
    public Customer convert(String id) { 
     return this.customerRepository.findOne(Long.valueOf(id)); 
    } 
} 

今のSpring MVCでこのコンバータを登録します。

<mvc:annotation-driven conversion-service="conversionService"/> 

<bean id="conversionService" 
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 
    <property name="converters"> 
     <list> 
      <bean class="IdToCustomerConverter"/> 
     </list> 
    </property> 
</bean> 
+2

私がこのようなアプローチについて嫌いなのは、データベースからそのようなIDを持つデータオブジェクトを既に読み込んでいるということです。これを文字列からオブジェクトに変換すると、dbから再度フェッチします。 –

+0

@Biju Kunjummen:注釈とコントローラのクラスコードで回答を更新できますか –

関連する問題