1

背景/问题

我正在尝试创建一个可重用的 JSF 复合组件,该组件可以通过将组件打包到 jar 中来在许多应用程序之间共享(类似于Deploy JSF 复合组件以供共享使用JSF 2.0 复合组件到 jar 中)。

当尝试在 Eclipse 中的 Web 项目的 facelets 页面中引用这些组件时,它不会自动完成(内容辅助)我的复合组件的标签或属性。

在NetBeans中使用相同的复合组件 jar可以工作(自动完成工作!)。

快速总结

  • Eclipse(实际上是 Rational Software Architect 8.0.4.1 - 基于 Eclipse Helios)

  • 启用了动态 Web 模块和 JSF 构面的 Web 项目

  • 构建路径上的复合组件 jar

  • 在 facelets 页面中声明的复合组件命名空间(有趣的是它会自动完成我组件的命名空间字符串)

  • 只有标准的 JSF 标签自动完成(h:、f:、ui: 等),以及 Primefaces (p:)

  • 我的复合组件没有自动完成功能:(

  • 如果我将组件移动到 Web 项目并从那里使用它,自动完成确实有效(但它不再可在其他项目中重用!)

细节

复合组件jar结构

我的复合组件jar在编译时有如下结构(我实际使用的是Maven,所以源码结构有点不同)。

composite-component.jar
|- META-INF/
|   |- beans.xml          (empty - just the beans tag)
|   |- faces-config.xml   (empty - just the faces-config tag/attributes)
|   \- resources
|       \- example
|           \- country.xhtml
\- com
     \- example
           |- Country.java
           |- CountryController.java  (the CDI managed bean)

复合组件定义

country.xhtml 有以下内容

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:cc="http://java.sun.com/jsf/composite"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

<!-- INTERFACE -->
<cc:interface>
    <cc:attribute name="value"
        shortDescription="A value expression for the selected value."
        required="true" />
</cc:interface>

<!-- IMPLEMENTATION -->
<cc:implementation>

    <p:autoComplete value="#{cc.attrs.value}"
        completeMethod="#{countryController.complete}" var="country"
        itemLabel="#{country.name}" itemValue="#{country.code}" dropdown="true"
        forceSelection="true">
    </p:autoComplete>

</cc:implementation>
</html>

托管豆

我的 CDI 托管 bean 有以下内容

package example;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;

@ApplicationScoped
@Named
public class CountryController {

    private static final List<Country> COUNTRIES = Arrays.asList(
        new Country("AUS", "Australia"), 
        new Country("FRA", "France"), 
        new Country("USA", "United States of America"));

    public List<Country> complete(String query) {
        List<Country> suggestions = new ArrayList<Country>();
        for (Country c : COUNTRIES) {
            if (c.getName().toLowerCase().contains(query.toLowerCase())) {
                suggestions.add(c);
            }
        }
        return suggestions;
    }
}

使用复合组件

如果我在 NetBeans 中创建一个 JSF 项目并将我的复合组件(和 Primefaces)添加到构建路径,将正确的命名空间添加到我的 facelets 页面 ( xmlns:x="http://java.sun.com/jsf/composite/example") 它就可以工作。

我的组件自动完成,它的属性,它甚至使用我的组件定义中的文档。

如果我将相同的复合组件 jar 添加到我的 Eclipse Web 项目的构建路径(启用 JSF 方面),我什么也得不到。它会自动完成标准 JSF 标记和 Primefaces,但不适用于我的组件。

我注意到 Primefaces 使用 taglib 文件——这是我的场景所需要的吗?我不想必须复制信息才能让自动完成功能正常工作。

编辑:

正如 tasel 所建议的,最好的解决方案(到目前为止)是安装JBoss Tools(特别是 RichFaces 插件)。这为打包在 jar 文件中的复合组件启用了自动完成功能(包括为您插入所有必需的属性,以及使用悬停文档自动完成所有其他属性)。

如果您使用 CDI,我还建议您安装 JBoss Tools CDI 插件,因为这可以让您自动完成 CDI 托管 bean 及其属性/方法。

Eclipse 更新站点 URL 是:

赫利俄斯:

http://download.jboss.org/jbosstools/updates/stable/helios/

靛青:

http://download.jboss.org/jbosstools/updates/stable/indigo/

我确实在从更新站点 URL 安装时遇到了问题,最终从更新页面下载了 p2 存储库并将其安装在本地,但除此之外,我很高兴在 Eclipse 中使用自动完成功能!

4

1 回答 1

1

不幸的是,Eclipse 中对 JSF 的支持不如 NetBeans 中那么舒服。我更喜欢使用来自 jBoss 的 RichFaces Tools 插件(它可以在没有 RichFaces 和任何容器的情况下完美运行)。你可以试一试。

尽管我还没有尝试过,但当前的 Eclipse 版本“Juno”可以更好地支持 JSF。

于 2012-07-19T10:14:42.003 回答