Проблемы с миграцией с JSF 1.2 на 2.0 - PullRequest
1 голос
/ 09 августа 2011

Мы решили перейти на JSF 2.0, к сожалению, это не сработало. Теперь у нас есть Mojarra, Tomahawk 2.0 1.1.11, Spring Webflow / Faces 2.3.0 и JSF 2.0.

Я следовал учебнику по обновлению от BalusC . Первым шагом было исправить web.xml и перейти на Servlet API 2.5.

<context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/facelets-taglibs/custom.taglib.xml</param-value>
</context-param>

<!-- Use JSF view templates saved as *.xhtml, for use with Facelets -->
<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xml</param-value>
</context-param>

После этого я заменил зависимости и использовал новые версии JSF.

<dependency>
  <groupId>com.sun.faces</groupId>
  <artifactId>jsf-api</artifactId>
  <version>2.0.3</version>
</dependency>

<dependency>
  <groupId>com.sun.faces</groupId>
  <artifactId>jsf-impl</artifactId>
  <version>2.0.3</version>
</dependency>

Я настроил нашу пользовательскую taglib и перешел на новое определение схемы XML,

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib version="2.0"
  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-facelettaglibrary_2_0.xsd">

<namespace>http://www.custom.org/facelets-taglib</namespace>

[...]

Я также внес все изменения в faces-config.xml.

Это один из моих *.jspx файлов.

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" version="2.0"
  xmlns:jsp="http://java.sun.com/JSP/Page"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:c="http://java.sun.com/jstl/core"
  xmlns:sf="http://www.springframework.org/tags/faces"
  xmlns:os="http://www.custom.org/facelets-taglib">
     [...]
     ${os:json()}
</html>

Перед миграцией этот файл работал отлично, это вызов определенной функции. Теперь он печатает:

Caused by: javax.faces.FacesException: /WEB-INF/views/example.jspx(10,2) 
        The attribute prefix os does not correspond to any imported tag library
    at com.sun.faces.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:136)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:115)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135)
    at org.springframework.faces.webflow.FlowLifecycle.render(FlowLifecycle.java:80)
    at org.springframework.faces.webflow.JsfView.render(JsfView.java:90)
    at org.springframework.webflow.engine.ViewState.render(ViewState.java:296)
    at org.springframework.webflow.engine.ViewState.refresh(ViewState.java:243)
    at org.springframework.webflow.engine.ViewState.resume(ViewState.java:221)
    at org.springframework.webflow.engine.Flow.resume(Flow.java:545)
    at org.springframework.webflow.engine.impl.FlowExecutionImpl.resume(FlowExecutionImpl.java:261)
    ... 67 more
Caused by: org.apache.jasper.JasperException: /WEB-INF/views/example.jspx(10,2) 
        The attribute prefix os does not correspond to any imported tag library
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
    at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
    at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148)
    at org.apache.jasper.compiler.Validator$ValidateVisitor$1FVVisitor.visit(Validator.java:1509)
    at org.apache.jasper.compiler.ELNode$Function.accept(ELNode.java:129)
    at org.apache.jasper.compiler.ELNode$Nodes.visit(ELNode.java:200)
    at org.apache.jasper.compiler.ELNode$Visitor.visit(ELNode.java:242)
    at org.apache.jasper.compiler.ELNode$Root.accept(ELNode.java:56)

Можете ли вы дать мне подсказку, где я что-то упустил или где может скрываться возможная ошибка? Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Вы используете JSPX вместо Facelets.Это не будет работать безупречно на JSF 2.0.Если обновление до JSF 2.1 , где поддерживается JSPX, не является вариантом, вам необходимо переименовать файлы .jspx в .xhtml и удалить лишнее объявление xmlns:jsp taglib.Удалите также тот контекстный параметр javax.faces.DEFAULT_SUFFIX, который по умолчанию уже равен .xhtml.

1 голос
/ 10 августа 2011

Проблема с файлами .jspx была решена в JSF 2.1, благодаря некоторым ребятам, которые поддерживают MyFaces Trinidad.См. Приложение A 1.2.1.1 Элемент обработки граней.Включив это, вы можете читать файлы .jspx с помощью движка Facelets и сохранять минимальные изменения.В двух словах просто добавьте это в файл names-config.xml:

<faces-config-extension>
    <facelets-processing>
        <file-extension>.jspx</file-extension>
        <process-as>jspx</process-as>
    </facelets-processing>
</faces-config-extension>

И, возможно, настройте javax.faces.FACELETS_VIEW_MAPPINGS или javax.faces.DEFAULT_SUFFIX для веб-конфигурации, чтобы добавить расширение jspx.

После этого, возможно, единственная проблема, с которой вы можете столкнуться - это преобразовать ваши старые теги jsp в FaceHet TagHandler и, возможно, преобразовать EL-функции в функции Facelets.Я думаю, что это легкая задача, и она того стоит.Обратите внимание на другую альтернативу (конвертируйте в xhml) в любом случае, вам также нужно будет выполнить этот шаг.

Эта альтернатива имеет то преимущество, что вам не нужно изменять существующие правила навигации или расширения страницы, поэтому сС точки зрения спецификации JSF эта альтернатива предпочтительнее.

Если у вас есть дополнительные вопросы по этому поводу, вы можете подписаться на пользователей MyFaces и списков рассылки разработчиков и задавать вопросы там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...