Spring MVC переплет - PullRequest
       1

Spring MVC переплет

5 голосов
/ 16 декабря 2010

У меня есть следующий объект команды:

public class User {
    private Department department;
    private String firstName;
    private String lastName;
    private String login;
    private String password;
...
}

, которое должно быть отображено на странице jsp:

<form:input path="lastName" />
<form:input path="department.name"/>
<form:input path="department.description"/>

Таким образом, когда я отправляю с пустыми департаментами.имя и департаментом.добавление, Spring автоматически создает экземпляр объекта Department с пустыми свойствами. (См. https://jira.springframework.org/browse/SPR-6032 Я бы оставил autoGrowNestedPaths = true)

Что нужно сделать, чтобы вернуть объект пользователя, где объект Department = null?

1 Ответ

5 голосов
/ 17 декабря 2010

Что нужно сделать, чтобы вернуть объект пользователя, где объект Department = null?

Если вы ищете решение для конкретного контроллера, найдите все пустые вложенные параметры и установите ихпараметры как запрещенные поля.

@InitBinder(value="user")
    public void bind(WebDataBinder dataBinder, WebRequest webRequest) {
        List<String> emptyParams = new ArrayList<String>();
        Iterator<String> itr = webRequest.getParameterNames();
        while(itr.hasNext()) {
            String name = itr.next();
            if(name.startsWith("department.")) {
                Object value = webRequest.getParameter(name);
                if("".equals(value)) {
                    emptyParams.add(name);
                }
            }
        }
        if(!emptyParams.isEmpty()) {
            dataBinder.setDisallowedFields(emptyParams.toArray(new String[emptyParams.size()]));
        }
    }

Если вы ищете универсальное решение, создайте пользовательское связыватель данных и удалите все вложенные пустые параметры.

public class CustomDataBinder extends ServletRequestDataBinder {

    @Override
    protected void doBind(MutablePropertyValues mpvs) {
        PropertyValue[] pvArray = mpvs.getPropertyValues();
        for (PropertyValue pv : pvArray) {
            boolean nestedProperty = PropertyAccessorUtils.isNestedOrIndexedProperty(pv.getName());
            if(nestedProperty && "".equals(pv.getValue())) {
                mpvs.removePropertyValue(pv);
            }
        }
        super.doBind(mpvs);
    }

}

И для использования CustomDataBinder выдолжен иметь пользовательский HandlerAdapter.

public class StandardAnnotationMethodHandlerAdapter extends AnnotationMethodHandlerAdapter    {
    @Override
    protected ServletRequestDataBinder createBinder(HttpServletRequest request, Object target, String objectName) throws Exception {
    CustomDataBinder dataBinder = new CustomDataBinder (target, objectName);
    return dataBinder;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...