Не могу получить вывод изTagLib - PullRequest
2 голосов
/ 10 марта 2011

Я пишу веб-приложение на основе Spring 3 MVC, используя JSP для своего слоя представления. Я борюсь за конкретную область, где я пытаюсь сообщить об ошибках BindingResult для конкретного объекта Model в JSP. Это, вероятно, лучше всего объяснить с помощью соответствующего кода:

Это мой метод Spring Controller:

@RequestMapping(value = "/**", method = RequestMethod.GET)
public ModelAndView get(@ModelAttribute("xApiRequest") @Valid final XAPIRequest xApiRequest,
                       final BindingResult xapiBindingResult,
                       final HttpServletResponse response,
                       Model model) throws EntityNotFoundException {
  String viewName = "/WEB-INF/views/get-single-entity.jsp";
  /* 
   * Create a MAV passing in the original Model object which contains:
   * 1: The 'xApiRequest' @ModelAttribute object.
   * 2: The BindingResult for the 'xApiRequest' object.
   */
  final ModelAndView mav = new ModelAndView(viewName, model.asMap());
  final XAPIResponse<Resource> xApiResponse = buildXAPIResponse(false, 200, xApiRequest, null);
  response.setStatus(200);
  mav.addObject("xApiResponse", xApiResponse);
  return mav;
}

Когда я выполняю этот метод, я вижу следующее:

  • Объект xApiRequest создан правильно из HttpServletRequest (у меня есть отдельный метод, который делает это)
  • Произошла проверка JSR-303, вызванная аннотацией @Valid, и выявила 2 ошибки проверки, которые, как я и ожидал, представлены в виде объектов BindingResult.
  • Объекты BindingResult присутствуют в параметре метода Model .
  • Объекты xApiRequest и BindingResult успешно переносятся из параметра метода Model в объект ModelAndView , который возвращается из метода.

И я могу подтвердить, что содержимое BindingResult действительно правильно идентифицирует объект xApiRequest в качестве источника ошибок проверки:

{xApiRequest=com.stretchr.xapi.entity.request.XAPIRequest@1e28608, org.springframework.validation.BindingResult.xApiRequest=org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'xApiRequest' on field 'userId': rejected value [null]; codes [NotEmpty.xApiRequest.userId,NotEmpty.userId,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [xApiRequest.userId,userId]; arguments []; default message [userId]]; default message [may not be empty]
Field error in object 'xApiRequest' on field 'projectId': rejected value [null]; codes [NotEmpty.xApiRequest.projectId,NotEmpty.projectId,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [xApiRequest.projectId,projectId]; arguments []; default message [projectId]]; default message [may not be empty]}

И JSP выглядит так:

<%@ page contentType="application/json; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="json" uri="http://www.atg.com/taglibs/json" %>
<%@ page session="false" %>
<spring:hasBindErrors name="xApiRequest">
</spring:hasBindErrors>
<c:if test="${errors}">
  <json:object name="exceptions">
    <json:property name="exceptionCount" value="${errors.errorCount}" />
    <json:property name="globalExceptionCount" value="${errors.globalErrorCount}" />
    <c:forEach var="error" items="${errors.allErrors}" varStatus="index">
      <json:property name="${index}" value="${error.defaultMessage}" />
    </c:forEach>
  </json:object>
</c:if>

Независимо от того, что я делаю, я не могу понять, что объект модели xApiRequest имеет ошибки привязки, поэтому вывод JSP не содержит исключений объект, содержащий подробную информацию об ошибках:

{
  w: false
  s: 200
  c: ""
  r: {
    o ~path: ""
  }
}

Кто-нибудь может увидеть, что я здесь делаю не так? В противном случае я могу отладить, что происходит во время обработки JSP? Я заинтересован в отладке библиотеки тегов Spring, но не совсем уверен, как установить связь между библиотекой тегов и соответствующим фрагментом кода.

Надеюсь, я предоставил здесь достаточно информации, но если потребуется больше, не стесняйтесь спрашивать.

Большое спасибо,

Edd

Ответы [ 3 ]

1 голос
/ 12 марта 2011

Как неловко, после попытки отладки класса BindErrorsTag я понял, что он вообще не вызывается. Это открытие позволило мне понять, что я не включил объявление пространства имен Spring taglib в JSP, в том числе это решило проблему.

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>

Проклинаю себя за то, что пропустил эту теперь очень очевидную ошибку и несколько запутался, почему JSP (и моя IDE) не жаловались на отсутствующее объявление taglib. Я думал, что пропущенное объявление taglib обычно вызывает RuntimeException при выполнении тега, но, похоже, это не так (хотелось бы, чтобы это сэкономило мне пару часов на отладку!)

В любом случае, проблема решена.

@ axtavt - Спасибо за помощь!

1 голос
/ 10 марта 2011

Переменная errors доступна только внутри тегов <spring:hasBindErrors>, поэтому вы должны сделать что-то вроде этого (обратите внимание, что она также заменяет <c:if>):

<spring:hasBindErrors name="xApiRequest">
<json:object name="exceptions">
    <json:property name="exceptionCount" value="${errors.errorCount}" />
    <json:property name="globalExceptionCount" value="${errors.globalErrorCount}" />
    <c:forEach var="error" items="${errors.allErrors}" varStatus="index">
      <json:property name="${index}" value="${error.defaultMessage}" />
    </c:forEach>
  </json:object>
</spring:hasBindErrors>
0 голосов
/ 06 ноября 2015

Боже мой! У меня была такая же проблема, большое спасибо за ответ на свой вопрос.

В моем случае - надеюсь, поможет кому-то еще - Простая JSP вызывает метод, такой как:

@RequestMapping(method = RequestMethod.GET)
protected Object loadRegistrationForm(HttpSession session, Model model) {

Этот возвращенный JSP имеет форму, которую можно отправить и получить в метод Server POST, поэтому у меня было следующее, чтобы зафиксировать ошибки, возвращенные из сообщения формы:

<spring:hasBindErrors name="customerAccountFormObj">    

<div class="alert alert-block pull-right alertmessage alert-warning alert-dismissible" role="alert" id="errorMsgHdr">
                    <button type='button' class='close' data-dismiss='alert' aria-label='Close'><span aria-hidden='true'>&times;</span></button>

                <form:errors path="*" cssClass="errorList" element="div"/>
</div>

</spring:hasBindErrors>

Как правило, в сообщении с предупреждением о начальной загрузке отображаются ошибки при наличии ошибок связывания. Угадайте, что происходит при вызове GET? Я получаю пустое окно с предупреждением ... после 12 часов постукивания я наткнулся на ваш вопрос, добавил

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

Вуаля! все чисто, нет пустого окна оповещения, т.е. нет ошибок при вызове GET. Это должно быть ошибка в JSP / Spring. Я использую Spring mvc 3.0.3.RELEASE, если это кому-нибудь поможет.

...