1

У меня есть небольшой проект (с использованием Spring 4.2.0, Spring Webflow 2.4.2, Hibernate validator 5.2.2), который работает как ожидается в мире сервлетов, но после преобразовывая его в портлет, обратная связь с проверкой в ​​JSP не работает полностью, как ожидалось.Тег ошибки проверки весны не работает полностью с webflow + портлетом

Для такой форме, которая выглядит следующим образом:

<form:form modelAttribute="person" action="${flowExecutionUrl}"> 
    <form:input path="voornaam"/> 
    .... 
</form:form> 

Это все еще работает в портлет (так я получаю по крайней мере, подтверждение того, что было вызвано моя ошибка проверки):

<form:errors path="*" /> 
    <form:errors path="voornaam" /> 

Этот надлежащим образом отображает:

<span id="person.errors">may not be empty</span> 
<span id="voornaam.errors">may not be empty</span> 

Но этот вариант <form:error />, где содержание в <form:error> тега должно быть вынесено в случае возникновения ошибок, перестал работать и не визуализируется:

<form:errors path="*"> 
    <p>Should only show in case of any errors</p> 
</form:errors> 

Некоторые из отладочных сообщений в журнале:

2016-02-23 15:18:36 DEBUG DefaultMessageContext:116 - Resolving message using [[email protected] source = 'voornaam', severity = ERROR, codes = array<String>['person.voornaam.NotBlank', 'voornaam.NotBlank', 'java.lang.String.NotBlank', 'NotBlank'], args = array<Object>[org.springframework.context.support.DefaultMessageSourceResolvable: codes [person.voornaam,voornaam]; arguments []; default message [voornaam]], defaultText = 'may not be empty'] 
2016-02-23 15:18:37 DEBUG SessionBindingConversationManager:86 - Putting conversation attribute 'scope' with value map['flashScope' -> map['viewUserEventState' -> [[email protected] eventId = 'save', mappingResults = Mapping Results = [[[email protected] mapping = parameter:'execution' -> execution, code = 'propertyNotFound', error = true, errorCause = org.springframework.binding.expression.PropertyNotFoundException: Property not found, originalValue = 'e1s2', mappedValue = [null]], [[email protected] mapping = parameter:'achternaam' -> achternaam, code = 'success', error = false, originalValue = 'Prefab achternaam', mappedValue = 'Prefab achternaam'], [[email protected] mapping = parameter:'tussenvoegsel' -> tussenvoegsel, code = 'success', error = false, originalValue = '', mappedValue = ''], [[email protected] mapping = parameter:'voornaam' -> voornaam, code = 'success', error = false, originalValue = '', mappedValue = '']]], 'messagesMemento' -> map[[null] -> list[[empty]], 'voornaam' -> list[[[email protected] source = 'voornaam', severity = ERROR, text = 'may not be empty']]]]] 
2016-02-23 15:18:37 DEBUG AbstractMvcView:194 - Rendering MVC [org.springframework.web.servlet.view.JstlView: unnamed; URL [/WEB-INF/flows/editPersonDetails.jsp]] with model map [{viewUserEventState=[[email protected] eventId = 'save', mappingResults = Mapping Results = [[[email protected] mapping = parameter:'execution' -> execution, code = 'propertyNotFound', error = true, errorCause = org.springframework.binding.expression.PropertyNotFoundException: Property not found, originalValue = 'e1s2', mappedValue = [null]], [[email protected] mapping = parameter:'achternaam' -> achternaam, code = 'success', error = false, originalValue = 'Prefab achternaam', mappedValue = 'Prefab achternaam'], [[email protected] mapping = parameter:'tussenvoegsel' -> tussenvoegsel, code = 'success', error = false, originalValue = '', mappedValue = ''], [[email protected] mapping = parameter:'voornaam' -> voornaam, code = 'success', error = false, originalValue = '', mappedValue = '']]], org.springframework.validation.BindingResult.person=org.springframework.webflow.mvc.view.BindingModel: 1 errors 
Field error in object 'person' on field 'voornaam': rejected value [null]; codes []; arguments []; default message [may not be empty], masterData={tussenvoegsel=[, de...]}, currentUser=10201, viewScope=map[[empty]], flowExecutionKey=e1s2, flowExecutionUrl=http://localhost:8080/web/guest/person-details?p_auth=Cknp0vsP&p_p_id=webflowportlet_WAR_webflowpoc10SNAPSHOT&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-1&p_p_col_count=1&_webflowportlet_WAR_webflowpoc10SNAPSHOT_execution=e1s2, person=Person{voornaam='', achternaam='Prefab achternaam', tussenvoegsel=''}, flashScope=map['viewUserEventState' -> [[email protected] eventId = 'save', mappingResults = Mapping Results = [[[email protected] mapping = parameter:'execution' -> execution, code = 'propertyNotFound', error = true, errorCause = org.springframework.binding.expression.PropertyNotFoundException: Property not found, originalValue = 'e1s2', mappedValue = [null]], [[email protected] mapping = parameter:'achternaam' -> achternaam, code = 'success', error = false, originalValue = 'Prefab achternaam', mappedValue = 'Prefab achternaam'], [[email protected] mapping = parameter:'tussenvoegsel' -> tussenvoegsel, code = 'success', error = false, originalValue = '', mappedValue = ''], [[email protected] mapping = parameter:'voornaam' -> voornaam, code = 'success', error = false, originalValue = '', mappedValue = '']]]], flowRequestContext=[[email protected] externalContext = org[email protected]603391cf, currentEvent = [null], requestScope = map[[empty]], attributes = map[[empty]], messageContext = [[email protected] sourceMessages = map[[null] -> list[[empty]], 'voornaam' -> list[[[email protected] source = 'voornaam', severity = ERROR, text = 'may not be empty']]]], flowExecution = [[email protected] flow = 'personDetails', flowSessions = list[[[email protected] flow = 'personDetails', state = 'editPersonDetails', scope = map['masterData' -> map['tussenvoegsel' -> list['', 'de', 'den', 'ten', 'ter', 'uit', 'van', 'van de', 'van den', 'van der']], 'viewScope' -> map[[empty]], 'person' -> Person{voornaam='', achternaam='Prefab achternaam', tussenvoegsel=''}]]]]]}] 

я уже не пытался нет помогло:

  • container-runtime-option с javax.portlet.actionScopedRequestAttributes набор для true
  • Распайка AnnotationMethodHandlerAdapter с ConfigurableWebBindingInitializer с помощью моего LocalValidatorFactoryBean
  • Размножение такое же поведение с официальным образцом проекта booking-portlet-mvc, который показал ту же самую ошибку. (Я добавил строку <form:errors path="checkinDate">only shown on error</form:errors> к enterBookingDetails.jsp, который не оказывает)

Любые подсказки о различиях между сервлетов и портлетов мира, которые могли бы привести к этому? Или какие-либо намеки на то, где искать в отладке?

+0

Вы проверили с более новыми версиями Spring framework? –

ответ

0

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

<%@ attribute name="path" required="true" type="java.lang.String" description="The path, or a wildcard '*'" %> 
<spring:bind path="${path}"> 
    <c:if test="${status.errors.errorCount > 0}"> 
     <jsp:doBody /> 
    </c:if> 
</spring:bind> 
Смежные вопросы