9

SpringMVCは初めてです。Spring、Spring MVC、JPA/Hibernateを使用するアプリを作成しています。SpringMVCにドロップダウンからモデルオブジェクトに値を設定させる方法がわかりません。これは非常に一般的なシナリオだと想像できます

コードは次のとおりです。

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>

InvoiceController.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";
    }
}

InvoiceControler.addInvoice()が呼び出されると、Invoiceインスタンスがパラメーターとして受信されます。請求書には期待どおりの金額がありますが、顧客インスタンス属性はnullです。これは、http postが顧客IDを送信し、InvoiceクラスがCustomerオブジェクトを予期しているためです。それを変換する標準的な方法はわかりません。

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

何か案は?

4

1 に答える 1

7

すでに述べたように、ドロップダウンからのIDをカスタムインスタンスに変換するカスタムコンバーターを登録するのがコツです。

次のようにカスタムコンバーターを作成できます。

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

次に、このコンバーターをSpringMVCに登録します。

<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>
于 2012-11-20T19:53:35.050 に答える