如何使在JAR JSF复合组件的Eclipse自动完成的工作?(How to make Eclips

2019-10-17 01:06发布

背景/问题

我试图创建可以许多应用程序之间通过封装在罐的组件(类似于共享的可重复使用JSF复合部件部署为共享使用JSF复合组件和JSF 2.0复合部件到罐 )。

当试图把这些部件在Eclipse Web项目的Facelets页面,它不会自动完成(内容辅助)的标签或我的复合组件的属性。

使用NetBeans中的相同的复合成分罐子工程 (自动完成的作品!)。

快速摘要

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

  • 使用动态Web模块和JSF方面的Web项目启用

  • 在构建路径中复合材料部件的jar

  • 在Facelets页面宣告复合组件的命名空间(有趣的是它自动完成我的组件的命名空间的字符串)

  • 只有标准JSF标签自动完成(H:,F:,UI:等),以及Primefaces(P :)

  • 没有自动完成我的复合成分:(

  • 如果我移动组件的Web项目,并从那里消耗它自动完成做工作 (但随后它在其他项目不再重复使用!)

细节

复合部件罐结构

我复合材料部件的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>

托管bean

我的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使用标签库文件 - 这是什么需要我的情况? 我讨厌有复制的信息来获得自动完成工作。

编辑:

作为tasel曾建议,最好的解决方案(到目前为止)是安装JBoss的工具 (特别是RichFaces的插件)。 这使得自动完成了打包在jar文件(包括所有插入强制属性的你,和自动填充与徘徊文档的所有其他属性)复合材料部件。

我也建议,如果你正在使用CDI,因为这让你自动完成的CDI托管bean和它们的属性/方法安装JBoss的工具CDI插件。

Eclipse更新网站网址是:

太阳神:

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

靛青:

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

我也有从更新站点URL安装问题,结束了从下载P2回购更新页面 ,并在本地安装它,但是从我很高兴有自动完成在Eclipse工作分开!

Answer 1:

不幸的是,在Eclipse支持JSF不一样舒适NetBeans中。 我更喜欢使用从JBoss的工具插件RichFaces的(这完全工作没有RichFaces和与任何容器)。 你可以试试看。

JSF为更好地支持被认为是可与当前的Eclipse版本“朱诺”虽然我还没有尝试过呢。



文章来源: How to make Eclipse autocomplete work with JSF composite components in JAR?