@ResourceMapping, который принимает JSON из запроса Ajax

Я ищу, как я могу интерпретировать параметр JSON в моем @ResourceMapping в Spring Portlet MVC. Когда я добавил @RequestBody, я получил сообщение: @RequestBody не поддерживается... Действительно застрял на этом.

У меня есть это:

Вид сбоку:

<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>

Сторона контроллера:

@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());
}

Как я могу использовать весеннюю магию для автоматического сопоставления этих данных JSON с моей собственной моделью? Примечание: это Spring Portlet MVC, а не обычный Spring MVC.

3 ответа

Решение

Вам нужно построить свой объект json следующим образом:

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']);
            }
        });

В вашем контроллере вы должны использовать аннотацию @ModelAttribute:

@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());
}

Не забывайте свои бобы:

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;
}

}

Аннотация @ResponseBody не поддерживается "из коробки" в среде портлетов Spring MVC, но вы можете реализовать @ResponseBody самостоятельно.

Мы делаем это, внедряя пользовательский тип представления, модель и преобразователь представления.

  1. Реализуйте пользовательскую модель и преобразователь представления (ModelAndViewResolver), скажем, JsonModelAndViewResolver.
  2. В методе resolModelAndView проверьте, имеет ли метод контроллера аннотацию @ResponseBody (или более конкретное условие для идентификации выходных данных JSON - например, аннотация + требуемый поддерживаемый тип MIME).
  3. Если да, верните свою собственную реализацию View - скажем, представление SingleObjectJson (расширяющее AbstractView).
  4. Передайте ваш сериализуемый объект экземпляру представления.
  5. Представление будет сериализовать объект в формат JSON и записать его в ответ (с помощью Jackson, Gson или другого фреймворка в методе renderMergedOutputModel).
  6. Зарегистрируйте новый преобразователь как AnnotationMethodHandlerAdapter.customModelAndViewResolvers.

Согласно документации, @RequestBody поддерживается только в средах сервлетов, но не в средах портлетов (то же самое для @ResponseBody). Кажется, вы не можете использовать эту функциональность.

Другие вопросы по тегам