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());
}
}
Порядок, в котором метод вызывается так:
- Модель projectListCount
- Модель projectList
- Визуализация проекта List
Я не понимаю, почему 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>
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, но проблема не изменилась.