2012-11-20 12 views
9

Jestem nowa w Spring MVC. Piszę aplikację, która używa Spring, Spring MVC i JPA/Hibernate Nie wiem, jak ustawić Spring MVC ustawić wartość pochodzącą z rozwijanego menu na obiekt modelu. Mogę sobie wyobrazić, że jest to bardzo powszechny scenariuszOprawa opadająca wiosną MVC

Oto kod:

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 
} 

Customer.java

@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> 

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

Gdy InvoiceControler.addInvoice() jest wywoływana faktura przykład umieszczany jako parametr. Faktura ma kwotę zgodnie z oczekiwaniami, ale atrybut instancji klienta ma wartość NULL. Dzieje się tak, ponieważ wpis http przesyła identyfikator klienta, a klasa Faktura oczekuje obiektu klienta. Nie wiem, jaki jest standardowy sposób przekonwertowania tego.

Przeczytałem o Controller.initBinder(), o konwersji typu Spring (w http://static.springsource.org/spring/docs/current/spring-framework-reference/html/validation.html), ale nie wiem, czy jest to rozwiązanie dla tego problemu.

Wszelkie pomysły?

+3

Zrobiłem to działa zastępując przez

Odpowiedz

7

Podstęp, jak już wspomniano, polega na zarejestrowaniu niestandardowego konwertera, który przekształci identyfikator z listy rozwijanej w instancję niestandardową.

można napisać niestandardowej konwerter ten sposób:

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

teraz zarejestrować tego konwertera z wiosennym 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

To, co nie lubię w takim podejściu, to to, że już załadowałeś obiekt danych z takim ID z bazy danych. Teraz po przekonwertowaniu go z ciągu na obiekt, należy go pobrać ponownie z bazy danych. –

+0

@Biju Kunjummen: czy możesz zaktualizować swoją odpowiedź również za pomocą kodu klasy Adnotation and Controller –