2012-11-20 14 views
9

Spring MVC için yeni. İlkbahar, İlkbahar MVC ve JPA/Hazırda Bekletme'yi kullanan bir uygulama yazıyorum Bahar MVC'nin bir açılır menüden model nesnesine nasıl bir değer yazacağını bilmiyorum. Customer.javaSpring MVC'de açılır kapanır değer bağlaması

@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

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

    private double amount; 

    @ManyToOne(targetEntity=Customer.class, fetch=FetchType.EAGER) 
    private Customer customer; 

    //Getters and setters 
} 

: Bunun çok yaygın bir senaryo İşte

hayal koddur

InvoiceCon troller.java InvoiceControler.addInvoice() çağrılır, bir fatura örneği bir parametre olarak alınan

@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"; 
    } 
} 

. Faturada beklendiği gibi bir tutar var, ancak müşteri örneği özniteliği boş. Bunun nedeni, http gönderiminin müşteri kimliğini ve Fatura sınıfının bir Müşteri nesnesini beklemesidir. Bunu dönüştürmenin standart yolu nedir bilmiyorum.

Controller.initBinder() hakkında, Spring Type dönüşümü hakkında (http://static.springsource.org/spring/docs/current/spring-framework-reference/html/validation.html numaralı telefondan) okudum, ancak bu sorunun çözümü olup olmadığını bilmiyorum.

Herhangi bir fikrin var mı?

+3

Ben

by

cevap

7

Önceden belirttiğiniz numara, kimliği aşağı açılan menüden Özel örneğe dönüştürecek özel bir dönüştürücü kaydetmektir.

Özel bir converter bu şekilde yazabiliriz:

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

Şimdi Bahar MVC ile bu dönüştürücü kayıt:

<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

Bu tür bir yaklaşımdan hoşlanmadığım şey, veri tabanını bu tür bir veri tabanına sahip zaten yüklemiş olmanızdır. Artık dizeden nesnesine geri dönüştürdüğünüzde, onu tekrar db'den alırsınız. –

+0

@Biju Kunjummen: Lütfen cevabınızı Annotation and Controller sınıf koduyla da güncelleştirebilir misiniz? –

İlgili konular