Obtendo modelos / arquivos do Facelets a partir de um sistema de arquivos ou database externo

Eu consigo fazer isso funcionar com o modelo no meu aplicativo:

 

Eu também sou capaz de mover o template para /META-INF/templates/mytemplate.xhtml de um JAR e fazer isso funcionar:

  

Eu realmente gostaria de colocar este arquivo no sistema de arquivos (ou database para esse assunto). Como posso conseguir isso? Eu encontrei muitas coisas relacionadas a com.sun.facelets.impl.DefaultResourceResolver , mas eu não acho que isso está realmente relacionado a replace a veiculação do template. Não está tentando resolver uma URL, ela está simplesmente tentando obter o arquivo de alguma forma no classpath.

   

Se você já está no JSF 2.2, você pode fazer isso fornecendo um ResourceHandler customizado no qual você retorna o recurso de visualização desejado em createViewResource() .

 public class FaceletsResourceHandler extends ResourceHandlerWrapper { private ResourceHandler wrapped; public FaceletsResourceHandler(ResourceHandler wrapped) { this.wrapped = wrapped; } @Override public ViewResource createViewResource(FacesContext context, final String name) { ViewResource resource = super.createViewResource(context, name); if (resource == null) { resource = new ViewResource() { @Override public URL getURL() { try { return new File("/some/base/path", name).toURI().toURL(); } catch (MalformedURLException e) { throw new FacesException(e); } } }; } return resource; } @Override public ResourceHandler getWrapped() { return wrapped; } } 

Qual é registrado em faces-config.xml como abaixo:

  com.example.FaceletsResourceHandler  

Ou se você ainda não estiver no JSF 2.2, use o ResourceResolver .

 public class FaceletsResourceResolver extends ResourceResolver { private ResourceResolver parent; public FaceletsResourceResolver(ResourceResolver parent) { this.parent = parent; } @Override public URL resolveUrl(String path) { URL url = parent.resolveUrl(path); // Resolves from WAR. if (url == null) { try { url = new File("/some/base/path", path).toURI().toURL(); } catch (MalformedURLException e) { throw new FacesException(e); } } return url; } } 

Qual é registrado em web.xml como abaixo:

  javax.faces.FACELETS_RESOURCE_RESOLVER com.example.FaceletsResourceResolver  

Independentemente do modo, para fornecer o recurso do database, você pode salvá-los / armazená-los no sistema de arquivos em disco (temp) para que você possa fornecer o URL apenas por meio de File ou inventar um protocolo personalizado, como db:// e fornecer uma implementação URLStreamHandler e URLStreamHandlerFactory personalizada para executar a tarefa real de stream contínuo do database. Você pode encontrar um exemplo de kickoff aqui Registrando e usando um protocolo java.net.URL personalizado .