我正在尝试创建一个可重用的JSF复合组件,可以通过将组件打包到jar中来共享许多应用程序(类似于Deploy JSF composite components for shared use和JSF 2.0 composite component into jar)。
当尝试在Eclipse中的Web项目的facelets页面中引用这些组件时,它不会自动完成(内容辅助)我的复合组件的标记或属性。
在 NetBeans中使用相同的复合组件jar (自动完成工作!)。
快速摘要
Eclipse(实际上是Rational Software Architect 8.0.4.1 - 基于Eclipse Helios)
启用了动态网络模块和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>
托管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 facet),我什么也得不到。它自动完成标准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安装的问题,最终从update page下载p2 repo并在本地安装它,但除此之外,我很高兴能在Eclipse中使用自动完成功能!
答案 0 :(得分:1)
不幸的是,Eclipse中对JSF的支持并不像NetBeans那样舒适。 我更喜欢使用jBoss的RichFaces工具插件(它可以在没有RichFaces和任何容器的情况下完美运行)。你可以尝试一下。
当前的eclipse版本'Juno'认为可以更好地支持JSF,但我还没有尝试过。