2011-01-12 50 views
4

我提交表單2個對象,讓說,這種形式包含Spring MVC的綁定到具有相同的字段

<input name="address" ..> 

<input name="billingAddress" ..> 

我有2個對象,我需要綁定到:

class Address { 
    String address; 
    .. 
} 

class BillingAddress { 
    String address; 
    .. 
} 

明顯billingAddress不會綁定解決BillingAddress沒有一些魔法。

可以說我有兩個AddressBillingAddress多個相同的字段,但表單上我計費,即billingFirstName,billingLastName等

前綴計費投入是有,我可以綁定到BillingAddress一些優雅的方式我可以重複使用類似的問題?
(或者是有沒有更好的辦法來解決這個然後我都拿出了?)

回答

6

如果你的魔杖使用一個以上的ModelAttribute,你必須創建一個包裝對象,它擁有的一個實例每個ModelAttribute。在你的情況下,我會創建一個叫做「FormModel」的包裝對象,它包含一個地址實例和一個BillingAddress實例。

class FormModel { 
    private Address address; 
    private BillingAddress billingAddress; 

    // Getters and Setters 
} 

現在使用FormModel作爲ModelAttribute。 在你的表格,你可以定義你的輸入元素,如:

<input name="address.address" ..> 
<input name="billingAddress.address" ..> 

控制器:

@RequestMapping(value = "/save", method = RequestMethod.POST) 
public String save(Model model, @ModelAttribute() FormModel formModel) { 
    // process formModel.getAddress() 
    // process formModel.getBillingAddress() 

    return "redirect:home"; 
} 

如果您使用的地址和BillingAddress自定義驗證,你還可以創建一個調用AddressValidator對象一個FormModelValidator和BillingAddressValidator:

public class FormModelValidator implements Validator { 

    private final AddressValidator addressValidator; 

    private final BillingAddressValidator billingAddressValidator; 

    public FormModelValidator(AddressValidator addressValidator, 
      BillingAddressValidator billingAddressValidator) { 
     this.addressValidator = addressValidator; 
     this.billingAddressValidator = billingAddressValidator; 
    } 

    public boolean supports(Class<?> clazz) { 
     return FormModel.class.equals(clazz); 
    } 

    public void validate(Object target, Errors errors) { 
     FormModel formModel = (FormModel) target; 
     try { 
      errors.pushNestedPath("address"); 
      ValidationUtils.invokeValidator(this.addressValidator, 
        formModel.getAddress(), errors); 
     } finally { 
      errors.popNestedPath(); 
     } 
     try { 
      errors.pushNestedPath("billingAddress"); 
      ValidationUtils.invokeValidator(this.billingAddressValidator, 
        formModel.getBillingAddress(), errors); 
     } finally { 
      errors.popNestedPath(); 
     } 
    } 

} 
+0

這給了我一個新問題;)我嘗試驗證BillingAddress和AddressObjects使用自己的驗證器,但BindingResult object指的是FormModel對象,因此無法找到錯誤的其他2個對象的任何字段。 – mkoryak 2011-01-12 18:53:33

相關問題