Create MethodExpression, содержащий метод с параметром типа Object, генерирует исключение синтаксического анализа - PullRequest
0 голосов
/ 14 мая 2019
  • Я создаю выражение MethodExpression напрямую через код Java.
  • Он представляет собой вызов метода bean с параметром вроде follow.
#{bean.method(TheObjectInstance)}
  • Объект представляет собой простой пользовательский объект pojo
public class TheObject
{
   public String value0 = "value0";
}
  • Теперь мы создадим метод MethodExpression следующим образом.
    TheObject object = new TheObject();

    FacesContext context = FacesContext.getCurrentInstance();
    Application application = context.getApplication();
    ExpressionFactory factory = application.getExpressionFactory();

    //Create method expression
    MethodExpression methodExpression = factory.createMethodExpression(
       context.getELContext(), 
       "#{bean.method(" + object + ")}", 
       null, 
       new Class<?>[] {TheObject.class});
  • Генерирует следующую ошибку.
javax.servlet.ServletException: Encountered "@" at line 1, column 87.
Was expecting one of:
    "." ...
    "(" ...
    ")" ...
    "[" ...
    "," ...
    ";" ...
    ">" ...
    "gt" ...
    "<" ...
    "lt" ...
    ">=" ...
    "ge" ...
    "<=" ...
    "le" ...
    "==" ...
    "eq" ...
    "!=" ...
    "ne" ...
    "&&" ...
    "and" ...
    "||" ...
    "or" ...
    "*" ...
    "+" ...
    "-" ...
    "?" ...
    "/" ...
    "div" ...
    "%" ...
    "mod" ...
    "+=" ...
    "=" ...
  • Я попробовал один и тот же код со строкой в ​​качестве параметра и логическим объектом, и он работает нормально, но использование пользовательского объекта вызывает ту же ошибку, а также, если мы передаем сложный объект, например, UIComponent.

  • Я использую JSF 2.2, любая помощь приветствуется.

1 Ответ

0 голосов
/ 18 мая 2019
  • Чтобы создать выражение MethodExpression с методом bean, содержащим объект в качестве параметра #{bean.method(object)}, мы должны использовать имя переменной, объявленной на странице HTML var=object.
    <h:form>
     <h:datatable var="object" value="#{bean.objects}">
      <h:commandbutton value="test" actionlistenner="#{bean.method(object)}"/>
    </h:datatable>
    </h:form>
  • Если мы хотим сгенерировать то же MethodExpression #{bean.method(object)}, нам потребуется сгенерировать полные элементы html, включая родительский элемент html, в нашем случае - таблицу данных, содержащую ссылку на объект var=object, а затем в коде MethodExpression
    //Wrong implementation: the object is converted as object.getClass().toString()
    MethodExpression methodExpression = factory.createMethodExpression(
       context.getELContext(), 
       "#{bean.method(" + object + ")}", 
       null, 
       new Class<?>[] {TheObject.class});

    //Right implementation: we refer to object referenced by the datatable var. 
    MethodExpression methodExpression = factory.createMethodExpression(
       context.getELContext(), 
       "#{bean.method(object)}", 
       null, 
       new Class<?>[] {TheObject.class});
...