2013-10-19 31 views
0

問題

  1. 有沒有辦法以編程方式配置相當-的面孔,不使用漂亮-config.xml文件?
  2. 如果必須使用pretty-config.xml;有沒有什麼辦法來以編程方式覆蓋/增加它的UrlMapppings?

問題背景:

在我的情況mapppings必須來自於另一個XML資源,還有一些額外的邏輯對待它。所以我設計了以下解決方案 我實現了一個ServletContextAttributeListener,我監視時prettyConfig對象由PrettyFilter添加到servlet上下文Prettyfaces編程配置

@Override 
public void attributeAdded(ServletContextAttributeEvent event) { 
    Object value = event.getValue(); 
    if(value != null && value instanceof PrettyConfig){ 
     PrettyConfig prettyConfig = (PrettyConfig)value ; 
     try { 
      PrettyFacesConfigProvider provider = new PrettyFacesConfigProvider() ; 
      PrettyConfig config = provider.loadConfiguration(event.getServletContext()); 
      prettyConfig.setMappings(config.getMappings()); 
     } catch (Exception ex) { 
      Logger.getLogger(CRSWebListener.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

PrettyFacesConfigProvider類是建立我的自定義映射配置的實現。我檢查了更新後的配置,似乎所有映射都已正確添加。但是,如果我採取這種方式,映射沒有任何影響。當然,如果我把這個映射放在pretty-config.xml中,它可以很好地工作。

我使用非常-面臨3.3.3,JSF 2.2,黃金面臨4.0,Tomcat的7

回答

0

有一個SPI稱爲ConfigurationProvider,使您可以實現自定義解決方案,用於提供PrettyFaces配置。 PrettyFaces在內部使用此SPI來提供不同的配置機制,如XMLannotations。但是你也可以使用SPI來實現構建配置的自定義方式。

剛剛創建的ConfigurationProvider實現,然後添加一個名爲META-INF/services/com.ocpsoft.pretty.faces.spi.ConfigurationProvider到類路徑的文件,並添加您的實現類的全類名存在(見this example這樣的文件和ServiceLoader這個插件機制的描述的javadoc )。

+0

我其實曾經嘗試過SPI技術,但無法使其工作。上面代碼中的類** PrettyFacesConfigProvider **實際上是完全相同的SPI兼容實現。您的評論後,我再次嘗試,它的工作。它不工作的原因是我把spi配置文件放在了錯誤的地方。我在資源目錄中創建了一個** META-INF/services **,把文件放在那裏和賓果! – thorondor