Подтвердить что ты не робот

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

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

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

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

<%@page contentType="text/html; charset=utf-8"%>
${testBean.test("hello")}

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

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

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

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

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

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

4b9b3361

Ответ 1

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>
    

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

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

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

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

Ответ 2

Пожалуйста, используйте tomcat 7, если вы используете el 2.2 и сервлет 3.0 Мы столкнулись с тем же и получили исправленную версию выше

Ответ 3

Поскольку я должен работать на Servlet 2.5, я сделал этот взлом:

JSP:

${testBean.test["hello"]}

Bean:

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;
}