Search code examples
ajaxjsonspringspring-portlet-mvc

@ResourceMapping that accepts JSON from Ajax request


I'm searching how I can interprete a JSON parameter in my @ResourceMapping in Spring Portlet MVC. When I add @RequestBody, I got the message: @RequestBody is not supported... Really stuck on this one.

I have this:

View side:

<portlet:resourceURL var="getTest" id="ajaxTest" ></portlet:resourceURL>

    <p>
        <button onClick="executeAjaxTest();">Klik mij!</button>
        <button onClick="$('#ajaxResponse').html('');">Klik mij!</button>
    </p>
    <p>
        <h3>Hieronder het antwoord:</h3>
        <h4 id="ajaxResponse"></h4>
    </p>

    <script>
        function executeAjaxTest() {

            var jsonObj = {
                    user: "Korneel",
                    password: "testpassword",
                    type: {
                        testParam: "test",
                    }
                }

            console.debug(JSON.stringify(jsonObj));
            $.ajax({
                dataType: "json",
                contentType:"application/json",
                mimeType: 'application/json',
                url:"<%=getTest%>",
                data:JSON.stringify(jsonObj),
                success : function(data) {
                    $("#ajaxResponse").html(data['testString']);
                }
            });

        }
    </script>

Controller side:

@ResourceMapping(value="ajaxTest")
    @ResponseBody
    public void ajaxTestMethod(ResourceRequest request, ResourceResponse response) throws IOException, ParseException {

        LOGGER.debug("ajax method");

        JSONObject json = JSONFactoryUtil.createJSONObject();
        json.put("testString", "Ik ben succesvol verstuurd geweest!");
        response.getWriter().write(json.toString());
}

How can I use the spring magic to auto map this JSON data to my own model? Note: It's Spring Portlet MVC, not regular Spring MVC..


Solution

  • You need to build your json object like this:

    var jsonObj = {
                    user: "Korneel",
                    password: "testpassword",
                    "type.testParam" : "test"
                };
    
    $.ajax({
                dataType: "json",
                contentType:"application/json",
                mimeType: 'application/json',
                url:"<%=getTest%>",
                data:jsonObj,
                success : function(data) {
                    $("#ajaxResponse").html(data['testString']);
                }
            });
    

    In your Controller you should use the @ModelAttribute annotation:

    @ModelAttribute(value = "jsonObj")
    public JsonObjCommand obtenerJsonObjCommand() {
        JsonObjCommand jsonObjCommand = new JsonObjCommand();
        return jsonObjCommand;
    }
    
    @ResourceMapping(value = "ajaxTest")
    public void ajaxTestMethod(
            ResourceRequest request,
            ResourceResponse response,
            @ModelAttribute(value = "jsonObj") JsonObjCommand jsonObjCommand)
            throws IOException, ParseException {
        LOGGER.debug("USER: " + jsonObjCommand.getUser());
        LOGGER.debug("Password: " + jsonObjCommand.getPassword());
        LOGGER.debug("TestParam: " + jsonObjCommand.getType().getTestParam());
        LOGGER.debug("ajax method");
    
        JSONObject json = JSONFactoryUtil.createJSONObject();
        json.put("testString", "Ik ben succesvol verstuurd geweest!");
        response.getWriter().write(json.toString());
    }
    

    Don't forget your beans:

    public class JsonObjCommand {
    
    private String user;
    private String password;
    private TypeJson type;
    
    public String getUser() {
        return user;
    }
    public void setUser(String user) {
        this.user = user;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public TypeJson getType() {
        return type;
    }
    public void setType(TypeJson type) {
        this.type = type;
    }
    
    }
    
    public class TypeJson {
    
    private String testParam;
    
    public String getTestParam() {
        return testParam;
    }
    
    public void setTestParam(String testParam) {
        this.testParam = testParam;
    }
    
    }