Java JSF2.0转换器无法从单独的jar文件工作
我有一个自定义转换器,可以在SelectOneMenu组件中选择国家/地区: 文件:address.jarJava JSF2.0转换器无法从单独的jar文件工作,java,jsf-2,converter,Java,Jsf 2,Converter,我有一个自定义转换器,可以在SelectOneMenu组件中选择国家/地区: 文件:address.jar @FacesConverter(value="CountryConverter", forClass=Country.class) public class CountryConverter implements Converter { private CountryBean countryBean = CountryBean.getCountryService(); @Overrid
@FacesConverter(value="CountryConverter", forClass=Country.class)
public class CountryConverter implements Converter {
private CountryBean countryBean = CountryBean.getCountryService();
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return countryBean.find(value);
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value != null)
return ((Country)value).getcc_fips();
else
return null;
}
这是xhtml文本:
文件:项目根目录
<h:selectOneMenu id="country" value="#{cc.attrs.addrEntity.country}">
<f:selectItem itemLabel="Please select one..."
noSelectionOption="true" />
<f:selectItems value="#{cc.attrs.addrBean.countries}"
var="model"
itemLabel="#{model.name}"
itemValue="#{model}"
noSelectionValue="“no selection”"/>
<f:converter ConverterId="CountryConverter"/>
</h:selectOneMenu>
我把转换器放在一个文件“address.jar”中,当我试图打开页面写入地址时,它会回答说:“表达式错误:找不到名为MyCustomCoverter的对象。”。即使我将转换器复制到xhtml文件所在的项目中,它也可以正常工作。我能做些什么来解决这个问题
为什么它不能从一个单独的jar文件中工作
谢谢。您必须在JAR文件中提供一个与JSF 2.0兼容的
/META-INF/faces config.xml
文件,以便让JSF自动扫描JAR文件以查找带有JSF注释的类
没有该文件,JSF将不会自动扫描JAR文件以节省性能,因此您的
@FacesConverter
将无法找到或注册。另一个重要细节是,JAR必须位于WAR(web应用程序)的lib目录中。如果您有一个带有WAR的EAR,并且带有转换器的JAR只在EAR中,而不在WAR的库中,那么JSF将找不到转换器。有关此问题的另一详细说明,请参见。@Martin:EAR/lib从来都不适用于特定于战争的库。JavaEE规范和JavaEE教程都没有提到这一点。不管怎样,任何把战争专用库放在耳朵里的人都是大错特错。这与战争特定的库是否包含JSF特定工件无关。@ BaluSc:考虑瘦战。如果我对两场战争都需要相同的转换器有一只耳朵会怎么样。我是否必须为JAR提供两个WAR的转换器类?它们不应该是通过EAR共享的一个罐子向战争提供转换器的一种方式吗?@Martin:只需给每一场战争一个罐子。战争不应该依赖耳朵。或者,在JavaEE容器中将JAR注册为WAR共享模块。为每一场战争提供自己的JAR是可行的,但这是一种非常浪费资源的方法。“战争共享模块”的想法听起来不错。你能提供一些链接/信息吗?我应该开始一个新问题吗?