Spring: ModelAttribute не вызывается

У меня есть контроллер, используемый для отображения списка проектов, но я не могу найти, почему метод @ModelAttribute не вызывается.

Это мой контроллер:

@Controller(value = "projectListController")
@RequestMapping(value = "VIEW")
public class ProjectListController {

@Autowired
@Qualifier("projectService")
private ProjectService projectService;

@RenderMapping
public String showProjects() {

    return "projectList";
}

@ModelAttribute("projectListCount")
public Long getProjectListCount() {

    return projectService.getProjectListCount();
}

@ModelAttribute("projectFilter")
public ProjectFilter getProjectFilter(
        @RequestParam(value = "cur", required = false) String curString,
        @RequestParam(value = "delta", required = false) String deltaString,
        @RequestParam(value = "orderByCol", required = false) String orderByCol,
        @RequestParam(value = "orderByType", required = false) String orderByType) {

    return new ProjectFilter(curString, deltaString, orderByCol, orderByType);
}

@ModelAttribute("projectList")
public List<TPrProgetti> getProjectList(
        @ModelAttribute("projectFilter") ProjectFilter projectFilter) {

    return projectService.getProgettiList(projectFilter.getCur(), projectFilter.getDelta(),
            projectFilter.getOrderByCol(), projectFilter.isAsc());
}
}

Порядок вызова метода следующий:

  1. Модельный проектListCount
  2. Модельный проектСписок
  3. Список проектов рендеринга

Я не понимаю, почему не вызывается Model projectFilter, который используется в качестве параметра в методе рендеринга. Я вижу, что Spring предпочитает вызывать конструктор ProjectFilter и устанавливать его поля через сеттеры. Другое дело, как выполняется это сопоставление...

РЕДАКТИРОВАТЬ

Просто чтобы завершить и ответить на комментарий, этот проект представляет собой портлет, развернутый в Liferay, и он использует Spring.

JSP был таким:

<liferay-ui:search-container emptyResultsMessage="No project found"
    orderByCol="${projectFilter.orderByCol}" orderByType="${projectFilter.orderByType}"
    delta="${projectFilter.delta}">
    <liferay-ui:search-container-results total="${progettiCount}"
        results="${projectList}">
    </liferay-ui:search-container-results>

    <liferay-ui:search-container-row
        className="it.eng.liferay.portlet.domain.TPrProgetti" keyProperty="id" modelVar="project">
        <liferay-ui:search-container-column-text name="Codice" property="codProg"  orderable="<%= true %>" orderableProperty="codProg"/>
        <liferay-ui:search-container-column-text name="Descrizione"  property="descrizione" orderable="<%= true %>" orderableProperty="descrizione"/>
        </liferay-ui:search-container-row>
    <liferay-ui:search-iterator />
</liferay-ui:search-container>

person luandrea    schedule 02.07.2014    source источник
comment
Вы можете опубликовать свою форму, пожалуйста?   -  person ROROROOROROR    schedule 03.07.2014


Ответы (1)


Я только что использовал один метод ModelAttribute, который содержит каждый ModelAttribute следующим образом:

@ModelAttribute
public void populateModel(Model model,
        @RequestParam(value = "cur", required = false) String curString,
        @RequestParam(value = "delta", required = false) String deltaString,
        @RequestParam(value = "orderByCol", required = false) String orderByCol,
        @RequestParam(value = "orderByType", required = false) String orderByType) {

    model.addAttribute("progettiCount", projectService.getProgettiCount());
    model.addAttribute("projectFilter", projectFilter);
    model.addAttribute("projectList", projectService.getProgettiList(projectFilter.getCur(), projectFilter.getDelta(),
                    projectFilter.getOrderByCol(), projectFilter.isAsc()));
}

Мне это не очень нравится, но это работает.

Я также пытался использовать последнюю версию Spring 4.0.5, но проблема не изменилась.

person luandrea    schedule 03.07.2014
comment
У вас уже есть атрибут модели в вашей форме? - person ROROROOROROR; 03.07.2014