четверг, 15 ноября 2012 г.

Spring MVC когда передача в модели параметра не простого типа

<form:form modelAttribute="userDataUpdatingSettings" id="orgSettingsForm" action="${userDataUpSave}" method="POST">
...
    <form:select path="email.condition" items="${attributeConditionValues}" />
    ...
И так userDataUpdatingSettings это объект нашего бина, email это поле бина, а email.condition это поле поля email, но оно не элементарного типа, а классового.
Так мы получим ексепшин при попытке сохранить это поле в модель.


Чтобы этого не произошло мы должны обеспечить реализацию java.bean.PropertyEditor для класса нашего этого поля.
Если этот проперти-эдитор будет в том же пакете, что и Класс проперти, то больше ничего делать не нужно.

Если же нет возможности эдитор в том же пакете, то есть несколько способов, но самый характерный для Spring MVC это через @InitBinder в аннотационном способе:

@Controller
public class MyFormController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }

    // ...
}

Или через перегрузку initBinder, если мы используем вариант через перегрузку SimpleFormController
public final class RegisterUserController extends SimpleFormController {

    private final PropertyEditorRegistrar customPropertyEditorRegistrar;

    public RegisterUserController(PropertyEditorRegistrar propertyEditorRegistrar) {
        this.customPropertyEditorRegistrar = propertyEditorRegistrar;
    }

    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder)
                        throws Exception {
        this.customPropertyEditorRegistrar.registerCustomEditors(binder);
    }

    // other methods to do with registering a User
}

Комментариев нет:

Отправить комментарий