MethodFailedException в ognl.OgnlRuntime.callAppresponMethod - PullRequest
6 голосов
/ 02 мая 2011

У меня есть рабочая форма Action и JSP, которую я использую для создания новых объектов в моем самом базовом приложении Struts 2.2.1.1. Я пытаюсь изменить приложение, чтобы повторно использовать ту же форму JSP для редактирования сущностей.

Я добавил «скрытый» тег ID и теперь получаю ошибки при отправке формы. Может кто-нибудь, пожалуйста, помогите мне?

Я гуглил эту проблему и видел, как другие публиковали подобные ошибки, но я не уверен, как ее решить.

Выдержка из трассировки стека при отправке формы:

2011-05-02 11:09:36,132 3198497 ["http-bio-8080"-exec-23] WARN
com.opensymphony.xwork2.ognl.OgnlValueStack - Error setting expression
'id' with value '[Ljava.lang.String;@100ac03'
ognl.MethodFailedException: Method "setId" failed for object
org.robbins.flashcards.model.Tag@1b9eb34 [name='null' ]
[java.lang.NoSuchMethodException:
org.robbins.flashcards.model.Tag.setId([Ljava.lang.String;)]
    at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1285)
    at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1474)

Выдержка из JSP:

<%@ taglib prefix="s" uri="/struts-tags"%>
...
<s:form action="saveOrUpdateTag" method="post">
    <s:hidden name="id" />
    <s:textfield name="name" key="label.tag.name" size="20" />
    <s:submit label="label.flashcard.submit" align="center" />
</s:form>

Выдержка из класса действий:

public class TagAction extends FlashCardsAppBaseAction implements
ModelDriven<Tag> {

    Tag tag = new Tag();

    public Tag getTag() {
        return tag;
    }

    public void setTag(Tag tag) {
        this.tag = tag;
    }
    public String createTag() {
        ...
       }
}

Выдержка из POJO:

public class Tag  implements java.io.Serializable {


     private int id;
     private String name;

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }
...
}

Выдержка из Struts.xml

    <action name="saveOrUpdateTag"
            class="org.robbins.flashcards.presentation.TagAction"
            method="createTag">
        <result name="success" type="tiles">displaytag.tiles</result>
        <result name="input" type="tiles">tagform.tiles</result>
    </action>

К вашему сведению - я также отправил этот вопрос в список рассылки Struts-User, но не получил никакой информации, поэтому собираюсь опубликовать его и здесь. Я обновлю другой пост и наоборот, когда появится больше информации.

Ответы [ 5 ]

9 голосов
/ 21 февраля 2012

Проблема NoSuchMethodException ... ([Ljava.lang.String;)] может быть вызвана наличием нескольких атрибутов с одинаковым именем в HTTP-запросе.

Если случай с несколькими атрибутами с одинаковымиимя допустимо, вы можете обрабатывать несколько значений идентификаторов, изменив setId (int id) на setId (String [] idArray) и проанализировав каждую строку члена массива как целое число.

Убедитесь, что существует только один метод setIdsetId (String [] idArray)) в классе действий.Кажется, что некоторые версии struts / ognl (ognl 3.0.4?) Могут запутаться, если существует несколько методов с одинаковыми именами, но разными типами параметров.

Например:

public void setId(String[] idArray) {
    for (String idString : idArray) {
       int id = Integer.parseInt(idString);
       ... handle different id values somehow ...
    }
}
2 голосов
/ 03 мая 2011

Стоит отметить, что трассировка стека является предупреждением, а не ошибкой.

Кроме того, предупреждение не выдается, когда поле формы фактически заполнено числом. Предупреждение и трассировка стека генерируются только в том случае, если оно пустое (или предположительно, если оно заполнено фактической строкой). Фактически, поле Id в модели POJO для класса Action успешно заполняется значением поля формы JSP, если оно присутствует (и номером, конечно).

Следовательно, мы можем либо игнорировать предупреждение, поскольку оно не причиняет нам никакого вреда, либо по умолчанию использовать Id для какого-либо числового значения, а затем добавить логику в наш класс Action для его решения.

Я решил проигнорировать предупреждение и соответственно настроил уровень log4j:

# Struts OgnlUtil issues unimportant warnings
log4j.logger.com.opensymphony.xwork2.util.OgnlUtil=error
log4j.logger.com.opensymphony.xwork2.ognl.OgnlValueStack=error

Более подробное обсуждение этой темы можно найти в списке рассылки Struts User здесь: http://mail-archives.apache.org/mod_mbox/struts-user/201105.mbox/%3CBANLkTinCzcTGjsn1jjotBr7fE_-5CX703w@mail.gmail.com%3E

0 голосов
/ 23 октября 2017

У меня тоже была такая же ошибка, братан. Но я как-то нашел ее 1. нам не нужно определять метод получения для поля ввода, принимаемого со страницы jsp, потому что он автоматически отображается на основе заданного имени. 2. Убедитесь, что переменные поля, которые вы передаете, не должны редуцировать. 3.В моем случае я выполняю ajax-вызов с передачей поля (например, userId) и при отправке формы (передача параметров также имеет userId). По этой причине была выдана ошибка. Затем я изменил имя параметра вызова ajax как ( например: userIdTemp), это работает хорошо.

0 голосов
/ 07 марта 2012

Я думаю, что это проблема скрытого что-то вроде

это, если у вас две страницы и если две страницы содержат одно и то же скрытое имя, как показано ниже вы получите ошибку ognl, удалите 1, например, если вы сохранили скрытое имя на первой странице и то скрытое имя, которое вы используете на 2-й странице, удалите на 2-й странице (если такое же скрытое имя присутствует) и запустите вашу программу, теперь не будет отображаться никаких ошибок. Почему это так, значит, возможно, мы уже спрятаны на предыдущей странице, и возможно использовать на 2-й странице без скрытого, с request.getParameter ("ваше имя"); (Здесь скрытая переменная over-write). и еще один, вместо того, чтобы давать скрытый ввод, как тип ввода скрытый, и давать имя и значение, лучше, я думаю.

0 голосов
/ 02 мая 2011

Полагаю, это старая ошибка. Попробуйте обновить до последней версии Ognl. Думаю, это 2.7. Что-то может быть. Самая последняя версия на github. Ищите там, если хотите быть уверенным, но 2,7 должно сработать, я думаю.

...