IllegalAccessException при доступе к методу Thymeleaf/OGNL

Я новичок в веб-разработке и пробую механизм шаблонов Thymeleaf в App Engine. До сих пор он работал нормально, за исключением того, что я всегда получаю java IllegalAccessException, когда пытаюсь получить доступ к методу (в отличие от простого атрибута).

Например, с этой строкой HTML:

<div class="panel" th:id="${item.getWebId()}">

Я получил:

java.lang.IllegalAccessException:
Method [public java.lang.String myapp.ItemInfo.getWebId()] cannot be accessed.
at ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:851) 

Это происходит как на сервере разработки (Win Vista), так и в рабочей среде с GAE SDK 1.9.0 и 1.8.9. Я пробовал текущий TL (2.1.2) и предыдущую версию (2.0.20). Я не использую Spring.

Я обнаружил, что другие имеют проблемы с отражением (здесь и здесь) на форуме TL, но ничего не помогает.

Некоторые люди, использующие Struts или Spring, давно столкнулись с подобными проблемами и решили их, установив OgnlRuntime.setSecurityManager(null). Я не занимался этим, потому что не вижу, как получить доступ к объекту OgnlRuntime в TL, и для меня не имеет особого смысла, что я буду единственным пользователем TL, которому это нужно.

Глядя на OgnlRuntime v3.0.6 (здесь) кажется, что самым простым решением было бы отключить «checkPermission», но опять же, как человек, новичок в TL, я не решаюсь вносить изменения, которые TL не раскрывает, и что никто другой, использующий TL, кажется, не должен этого делать. Должно быть что-то еще не так?


person Tom    schedule 11.03.2014    source источник
comment
Судя по тому, что я читал, похоже на ошибку загрузчика классов в GAE SDK. Установка SecurityManager в null выполняется System.setSecurityManager(null); до загрузки класса OgnlRuntime, но я бы не советовал этого делать.   -  person Tom Verelst    schedule 11.03.2014
comment
Да, я согласен, что это звучит как плохая идея, но это мой единственный вариант, поэтому я пошел дальше и сделал это (но через ServetContextListener). Это сработало, и я добавлю его как один из возможных ответов ниже, но все еще надеюсь на лучшее решение.   -  person Tom    schedule 11.03.2014
comment
@TomVerelst Кроме того, я также пробовал ваше предложение System.setSecurityManager(null), но у моего приложения не было разрешения на это, и решения, которые я нашел (изменение моей локальной политики безопасности), были только для моей локальной установки.   -  person Tom    schedule 11.03.2014


Ответы (1)


В конце концов я выбрал вариант OgnlRuntime.setSecurityManager(null). Это кажется плохой идеей, но пока позволяет мне продолжить.

Вот код, который я использовал:

public class MyContextListener implements ServletContextListener {
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
    }
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        OgnlRuntime.setSecurityManager(null);
    }
}

И в моем web.xml я добавил:

<listener>
    <listener-class>com.myapp.MyContextListener</listener-class>
</listener>
person Tom    schedule 11.03.2014