org.apache.jasper.JasperException: функциональный тест должен использоваться с префиксом, если пространство имен по умолчанию не указано

Я использую следующие вещи для моего проекта: Spring 3.0.1 + Apache Tiles 2.2.1 + Glassfish 2.1. Что я'я пытаюсь сделать, это вызвать какой-то метод на jsp-странице и передать ему некоторые параметры. Например, у меня есть боб:

@Component
@Scope(value = "singleton")
public class TestBean {
    public void test(String param){
        System.out.println("param = " + param);
    }
}

и у меня есть JSP-страница:


${testBean.test("hello")}

Этот код дает мне исключение, как:

org.apache.jasper.JasperException: функциональный тест должен использоваться с префиксом, если пространство имен по умолчанию не указано

Если я вызываю какой-то метод без передачи параметров - все в порядке.

Я попытался поместить jboss-el.jar в мой WEB-INF / lib и поместить необходимые параметры в web.xml (как объясненоВот), но без эффекта.

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

При всех этих условиях, есть ли решение для моей проблемы?

 kumade22 окт. 2012 г., 22:58
Spring делает это автоматически. Как объяснилВот, Если я создаю некоторый метод getter (например, getTest ()) и вызываю его таким же образом (но без параметров) (например: $ {testBean.test}) - все работает нормально. Так что проблема, я думаю, связана именно с параметризованным вызовом.
 Palpatim22 окт. 2012 г., 20:22
ГдеtestBean быть назначенным в вашем EL? Сообщение об ошибке предполагает, что EL интерпретируетtest() как функция, которая ожидает пространство имен, как при использовании функции JSTL.fn:replace()

Ответы на вопрос(3)

Решение Вопроса

org.apache.jasper.JasperException: функциональный тест должен использоваться с префиксом, если пространство имен по умолчанию не указано

Это указывает на то, что окружающая среда не• Поддерживает новую функцию EL 2.2, которая заключается в вызове методов bean с аргументами. Устаревшая среда пытается интерпретировать выражение как функцию EL, которая имеет обозначениеnamespace:functionName() (вроде как функции JSTL). Исключением является лишь жалоба на то, чтоnamespace: часть не может быть найдена для идентификации функции EL. Но это все-таки неправильно.

Необходимо убедиться, что выполняются следующие условия, чтобы можно было вызывать методы bean с аргументами в EL:

Целевой контейнер должен поддерживать EL 2.2. Все контейнеры, совместимые с Servlet 3.0, делают, так как EL 2.2 является частью Java EE 6, которая, в свою очередь, также охватывает Servlet 3.0. Примерами контейнеров Servlet 3.0 являются Tomcat 7.x, Glassfish 3.x и JBoss AS 6.x / 7.x.

/WEB-INF/web.xml Файл объявлен в соответствии со спецификацией Servlet 3.0 (и, следовательно, не старше, например 2.5).

<!--?xml version="1.0" encoding="UTF-8"?-->
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">

    <!-- Config here. -->

</web-app>

В противном случае ваш контейнер будет работать в резервном режиме, соответствующем версии, совпадающей вweb.xml объявление root, тем самым теряя все новые великолепные Servlet 3.0 и EL 2.2.

Веб-приложение/WEB-INF/lib делаетне содержат специфичные для контейнера библиотеки реализации EL, происходящие из контейнера более старой марки / версии, такие какel-api.jar и / илиel-impl.jar происходящий из Tomcat 6.x или около того.

Ваша конкретная проблема вызвана использованием контейнера, не совместимого с Servlet 3.0: старый Glassfish 2.x.

Обновитесь доGlassfish 3.x или искать альтернативные пути. Подход JBoss EL работает только для JSF, а не для Spring или "простая JSP ".

 kumade23 окт. 2012 г., 00:25
Спасибо за помощь, ребята (особенно BalusC). Так что теперь, в моем случае, решение состоит в том, чтобы избежать параметризованных вызовов, потому что моя конфигурация среды неЭто позволяет мне сделать это. И в будущем мне нужно использовать JSF или обновить \ изменить мой сервер приложений.
 jahroy22 окт. 2012 г., 23:25
Я думаю проблема в томGlassfish 2.1 (как заявлено @BalusC). Я помню, как переживал много трудностей, чтобы заставить EL 2.2 работать со Glassfish 2.1 и никогда не иметь успеха.

используйте Tomcat 7, если вы используете el 2.2 и servlet 3.0 Мы столкнулись с тем же и исправили с вышеупомянутой версией

JSP:

${testBean.test["hello"]}

Боб:

private Map test;

public Map getTest() {
    if (test == null) {
        test = new Map() {
            @Override
            public Object get(Object key) {
                System.out.println("param = " + key);
                return null;
            }

            @Override
            public int size() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public boolean isEmpty() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public boolean containsKey(Object key) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public boolean containsValue(Object value) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public Object put(Object key, Object value) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public Object remove(Object key) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public void putAll(Map m) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public void clear() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public Set keySet() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public Collection values() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public Set entrySet() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

        };
    }
    return test;
}

Ваш ответ на вопрос