1
votes

I've tried to clone a Spring MVC Portlet project but upon posting the form todo properties are all null.

Repo is available on Github.

Here is the Controller code

@Controller
@RequestMapping("VIEW")
public class ToDoListController {

    @RenderMapping
    public String view() {
        return "list";
    }

    @ActionMapping
    public void save(@Valid ToDo toDo, BindingResult result, @CookieValue("JSESSIONID") String jsessionid, 
            PortletSession session, ModelMap modelMap) {
        if (!result.hasErrors()) {
            // could use entityManager to persist; put in session for this example
            List<ToDo> toDos = (List<ToDo>) session.getAttribute("toDos");
            if (toDos == null) {
                toDos = new ArrayList<ToDo>();
            }
            toDos.add(toDo);
            session.setAttribute("toDos", toDos);

            modelMap.put("msg", String.format("You added a TODO: %s", toDo.getTitle()));
        }
    }

    @ModelAttribute
    private ToDo loadModel() {
        return new ToDo();
    }
}

Here is the View:

<%@ page contentType="text/html" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="portlet" uri="http://java.sun.com/portlet_2_0" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<c:if test="${msg ne null}">
    <div class="portlet-msg-success"><c:out value="${msg}" /></div>
</c:if>

<portlet:actionURL var="save" />

<form:form modelAttribute="toDo" action="${save}" method="POST">
    <fieldset>
        <legend>Add a TODO</legend>
        <div>
            <form:label path="title" cssStyle="display:block">Title:</form:label>
            <form:input path="title" />
            <form:errors path="title" cssClass="portlet-msg-error" />
        </div>
        <div>
            <form:label path="due" cssStyle="display:block">Due (MM/DD/YYYY):</form:label>
            <form:input path="due" />
            <form:errors path="due" cssClass="portlet-msg-error" />
        </div>
        <div>
            <form:label path="description" cssStyle="display:block">Description:</form:label>
            <form:textarea path="description" />
            <form:errors path="description" cssClass="portlet-msg-error" />
        </div>
        <div>
            <input type="submit" value="Save" />
        </div>
    </fieldset>
</form:form>

And here is the Context:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
                        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                        http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc.xsd
                        http://www.springframework.org/schema/context 
                        http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <mvc:annotation-driven validator="validator" />

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="cache" value="true" />
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/view/" />
        <property name="suffix" value=".jsp" />
    </bean>


    <bean id="validator"
        class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

    <bean id="annotationMethodHandlerAdapter"
        class="org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="webBindingInitializer">
            <bean id="configurableWebBindingInitializer"
                class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
                <property name="validator">
                    <ref bean="validator" />
                </property>
            </bean>
        </property>
    </bean>
</beans>

=====================================================================
Update:

Here is the working version: https://github.com/jzinedine/FirstPortlet

1
I had some similar issues. Which LR version are you using, is it 6.1GA2? Check your web.xml in the deployed webapps (the new LR version messes up the ContextLoaderListeners). Check this thread: stackoverflow.com/questions/13739905/…rlegendi
Thanks, I'm using Liferay 6.2.0GA1.Jahan

1 Answers

3
votes

You need to set <requires-namespaced-parameters>false</requires-namespaced-parameters> in your liferay-portlet.xml when using Spring MVC with Liferay 6.2. It is explained on Liferay 6.2 documentation at the end of this page.