Исключение SpelEvaluationException: EL1010E: Свойство или поле ‘MessageContext’ не может быть установлено для объекта типа ‘RequestControlContextImpl’

#java #spring #jsp #spring-webflow

#java #spring #jsp #spring-webflow

Вопрос:

Я использую Spring Web Flow для создания потока для оформления заказа. Пользователь должен авторизоваться и ввести свое имя пользователя в потоке, если пользователь введет имя пользователя другого человека, мой поток отклонит его заказ и поместит «Войти как этот пользователь» в контекст сообщения. Но, к сожалению, мой поток завершается сбоем с этим исключением:

  org.springframework.expression.spel.SpelEvaluationException: EL1010E: Property or field 'messageContext' cannot be set on object of type 'org.springframework.webflow.engine.impl.RequestControlContextImpl' - maybe not public or not writable?
  

Мой код потока

 <view-state id="login" >
    <transition on="loginEntered" to="lookupUser" validate="true"/>
</view-state>

<action-state id="msgcnt" >
    <evaluate expression="orderFlowService.msgCnt(messageContext)"  result="messageContext" />
    <transition on="yes" to="login" />
</action-state>

// other flows omitted 
  

мой метод msgCnt:

 public boolean msgCnt(MessageContext context){
  context.addMessage(new MessageBuilder().info().source("check").defaultText("Увійдіть як цей користувач !").build());
  return true;
}
  

и jsp-view:

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
 <head><title>Увійдіть!</title></head>
 <body>
  <h2>Нове замовлення!</h2>
  <p/>
  <h3>Введіть ваш логін. Якщо у вас його немає,введіть як бажаєте себе 
 назвати!</h3>
  <c:forEach items="${messageContext.getMessagesBySource(check)}" 
var="message">
    <h3>${message}</h3>
  </c:forEach>
  <form:form>
    <input type="hidden" name="_flowExecutionKey" value="${flowExecutionKey}"/>
    <input type="text" name="login" /><br/>

    <input type="submit" name="_eventId_loginEntered" value="Продовжити"/>
  </form:form>
 </body>
</html>
  

Ответ №1:

Я подозреваю, что происходит, так это то, что эта строка:

 <evaluate expression="orderFlowService.msgCnt(messageContext)"  result="messageContext" />
  

Пытается поместить результат из orderFlowService.msgCnt() (который является логическим значением «true») непосредственно в место, где он не ожидается, с именем «MessageContext», которое, возможно, даже может быть существующим объектом. Я предполагаю, что здесь есть некоторые внутренние компоненты, но думаю, может быть, это не то, что вы имели в виду / нужно было сделать?

Поскольку вы передаете messageContext в метод и добавляете сообщения внутри него, я думаю, вы вообще не хотите указывать result .

Комментарии:

1. Да, вы правы! Я заменил возвращаемое значение на void и удалил поле ‘result’ в flow, но теперь я просто перенаправляюсь на свою страницу без текста ошибки.

2. messageContext является зарезервированной переменной el. смотрите docs.spring.io/spring-webflow/docs/2.5.0.RELEASE/reference/html /…