2011-10-25 53 views
20

Tôi nhận thấy rằng khi cố gắng thiết lập webapp JSF 2 của tôi đang chạy trên cầu cảng, tôi có lỗi này:không thể tìm thấy Nhà máy: javax.faces.context.FacesContextFactory

java.lang.IllegalStateException: Ứng dụng không đúng khởi tạo lúc khởi động, không thể tìm thấy Nhà máy: javax.faces.context.FacesContextFactory

mà có thể dễ dàng giải quyết bằng cách này thêm vào web.xml của tôi

<listener> 
    <listener-class> 
     com.sun.faces.config.ConfigureListener 
    </listener-class> 
</listener> 

tôi đã cố gắng tìm kiếm một lời giải thích chi tiết nhưng trong vô ích ..

cầu cảng-maven-plugin: 8.0.3.v20111011: chạy + jdk 7 + eclipse chàm

Và đây là phụ thuộc maven của tôi:

<dependencies> 
    <dependency> 
     <groupId>org.glassfish</groupId> 
     <artifactId>javax.faces</artifactId> 
     <version>2.1.3</version> 
     <scope>compile</scope> 
    </dependency> 
</dependencies> 

Dưới đây là web.xml của tôi:

<?xml version="1.0" encoding="UTF-8"?> 

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 
    <display-name>Basic Setup Web Application</display-name> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>/faces/*</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
     <welcome-file>faces/index.xhtml</welcome-file> 
    </welcome-file-list> 
    <listener> 
     <listener-class> 
      com.sun.faces.config.ConfigureListener 
     </listener-class> 
    </listener> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value>Development</param-value> 
    </context-param> 
</web-app> 

và đây là đầu ra của các plugin cầu cảng:

[INFO] <<< jetty-maven-plugin:8.0.3.v20111011:run (default-cli) @ BasicSetup <<< 
[INFO] 
[INFO] --- jetty-maven-plugin:8.0.3.v20111011:run (default-cli) @ BasicSetup --- 
[INFO] Configuring Jetty for project: BasicSetup Maven Webapp 
[INFO] webAppSourceDirectory C:\Users\albert\workspace\BasicSetup\src\main\webapp does not exist. Defaulting to C:\Users\albert\workspace\BasicSetup\src\main\webapp 
[INFO] Reload Mechanic: automatic 
[INFO] Classes = C:\Users\albert\workspace\BasicSetup\target\classes 
[INFO] Context path = /basicSetup 
[INFO] Tmp directory = C:\Users\albert\workspace\BasicSetup\target\tmp 
[INFO] Web defaults = org/eclipse/jetty/webapp/webdefault.xml 
[INFO] Web overrides = none 
[INFO] web.xml file = file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/WEB-INF/web.xml 
[INFO] Webapp directory = C:\Users\albert\workspace\BasicSetup\src\main\webapp 
2011-10-25 14:24:51.091:INFO:oejs.Server:jetty-8.0.3.v20111011 
2011-10-25 14:24:51.334:INFO:oejpw.PlusConfiguration:No Transaction manager found - if your webapp requires one, please configure one. 
2011-10-25 14:24:52.108:INFO:oejsh.ContextHandler:started o.m.j.p.JettyWebAppContext{/basicSetup,[file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/, jar:file:/C:/Users/albert/.m2/repository/org/glassfish/javax.faces/2.1.3/javax.faces-2.1.3.jar!/META-INF/resources/]},file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/ 
2011-10-25 14:24:52.108:INFO:oejsh.ContextHandler:started o.m.j.p.JettyWebAppContext{/basicSetup,[file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/, jar:file:/C:/Users/albert/.m2/repository/org/glassfish/javax.faces/2.1.3/javax.faces-2.1.3.jar!/META-INF/resources/]},file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/ 
2011-10-25 14:24:52.108:INFO:oejsh.ContextHandler:started o.m.j.p.JettyWebAppContext{/basicSetup,[file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/, jar:file:/C:/Users/albert/.m2/repository/org/glassfish/javax.faces/2.1.3/javax.faces-2.1.3.jar!/META-INF/resources/]},file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/ 
2011-10-25 14:24:52.149:WARN:/basicSetup:unavailable 
java.lang.IllegalStateException: Application was not properly initialized at startup, could not find Factory: javax.faces.context.FacesContextFactory 
    at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:967) 
    at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:316) 
    at javax.faces.webapp.FacesServlet.init(FacesServlet.java:302) 
    at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:456) 
    at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:276) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:779) 
    at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:255) 
    at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1212) 
    at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:610) 
    at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:453) 
    at org.mortbay.jetty.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:256) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:224) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:167) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:224) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:89) 
    at org.eclipse.jetty.server.Server.doStart(Server.java:262) 
    at org.mortbay.jetty.plugin.JettyServer.doStart(JettyServer.java:65) 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) 
    at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:511) 
    at org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:364) 
    at org.mortbay.jetty.plugin.JettyRunMojo.execute(JettyRunMojo.java:514) 
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:107) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:319) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) 
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:534) 
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) 
[INFO] Started Jetty Server 
2011-10-25 14:24:52.165:INFO:oejs.AbstractConnector:Started [email protected]:8080 STARTING 
[INFO] Starting scanner at interval of 10 seconds. 

Bạn nghĩ gì?

+0

bạn có phụ thuộc mojarra không? – Bozho

+0

@Bozho: tôi giả sử có, vì chỉ cần thêm thẻ người nghe làm cho nó hoạt động – bertie

Trả lời

28

Trình nghe này là do JSF 1.x được cho là tự động được đăng ký bởi tệp định nghĩa thư viện thẻ jsf_core.tld. Bạn có thể tìm thấy nó trong thư mục /META-INF của tệp JAR thực thi JSF. Trong trường hợp cá móm 2.1.3 (mà bạn đang sử dụng theo các bản ghi), người nghe được đăng ký như sau từ dòng 80 và vào lúc:

<!-- ============== Configuration Listener ============== --> 

<!-- 
     This ServletContextListener initializes the runtime environment 
     of the JavaServer Faces Reference Implementation when a web 
     application including it is initialized by the container. 
--> 
<listener> 
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
</listener>  

Tuy nhiên, điều này là rõ ràng không được nhặt đúng bởi Jetty . Tôi cũng đã đọc ở đâu đó rằng khi FacesServlet được khởi tạo trước khi tệp TLD được xử lý, thì bạn cũng sẽ nhận được chính xác ngoại lệ này. Có lẽ điều này đang xảy ra trong Jetty. Để loại trừ một và khác, hãy cố gắng xóa mục nhập <load-on-startup> để nó sẽ chỉ được tải trên yêu cầu HTTP cụ thể đầu tiên, sau khi TLD được xử lý. Trong bất kỳ cách nào, đăng ký rõ ràng người nghe trong web.xml thực sự nên giải quyết nó.

Hơn nữa, vì JSF 2.x, ngoài tệp TLD, người nghe cũng được cho là tự động được đăng ký bằng cách thực thi ServletContainerInitializer trong tệp JAR để giải quyết lỗi Glassfish 3. Trong cá móm 2.x này là lớp com.sun.faces.config.FacesInitializer trong đó có những dòng sau bắt đầu từ dòng 131: (! Cho là) ​​

// The following line is temporary until we can solve an ordering 
// issue in V3. Right now the JSP container looks for a mapping 
// of the FacesServlet in the web.xml. If it's not present, then 
// it assumes that the application isn't a faces application. In this 
// case the JSP container will not register the ConfigureListener 
// definition from our TLD nor will it parse cause or JSP TLDs to 
// be parsed. 
servletContext.addListener(com.sun.faces.config.ConfigureListener.class); 

này hoạt động trong Servlet chỉ 3,0 container như Tomcat 7, Glassfish 3, Jetty 8, vv Bạn dường như đang sử dụng Jetty 8.0 do đó sẽ tuân thủ Servlet 3.0, nhưng web.xml của bạn được khai báo là Servlet 2.5 phù hợp, vì vậy vùng chứa sẽ chạy trong mô hình dự phòng Servlet 2.5. Thay đổi web.xml của bạn để phù hợp với Servlet 3.0 sẽ kích hoạt trình khởi tạo này.

+0

Tôi đã thử cả hai loại bỏ tải khởi động và chuyển sang 3.0, nhưng vẫn với cùng một thất bại. Tôi nghĩ đã tới lúc chuyển sang tomcat7 một lần nữa để kiểm tra mọi thứ. Tôi đã suy nghĩ để sử dụng cầu cảng cho khả năng của nó để triển khai một cách nhanh chóng với chiến tranh bùng nổ với các plugin maven. Tôi sẽ tìm cách khác để chúng hoạt động trong tomcat7 sau này. Cảm ơn bạn ! – bertie

+0

Bạn được chào đón. – BalusC

+0

Sau khi kích hoạt tính năng Jetty 8 "chú thích", tôi thấy rằng Jetty sử dụng một phiên bản của Jasper từ GlassFish cố ý bỏ qua Mojarra ConfigureListener được định nghĩa trong tệp TLD. Ngoài ra, Mojarra FacesInitializer sẽ không đăng ký Mojarra ConfigureListener nếu FacesServlet được định nghĩa trong web.xml. Tôi đã nhận nó để làm việc mặc dù bằng cách đăng ký một ServletContainerInitializer tùy chỉnh. Để biết thêm chi tiết, xem [Triển khai JSF Portlets trên Jetty] (http://www.liferay.com/community/wiki/-/wiki/Main/Deploying+JSF+Portlets+on+Jetty) và [FACES-1668] (http://issues.liferay.com/browse/FACES-1668). –

0

Một giải pháp khác: Tôi gặp lỗi này sau khi tạo tệp java khi đang di chuyển với CXF từ wsdl.

JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance(); 
Client client = factory.createClient(wsdlURL, serviceName); 

CXF đặt ClassLoader của riêng nó (ví dụ của URLClassLoader) vào trình nạp lớp của Thread. Nó hoạt động theo cách thông thường, cho đến khi luồng của người dùng vào FactoryFinder của JSF, được lưu trữ bởi ClassLoader làm khóa. Vì ClassLoader đã thay đổi, nó tạo ra một FactoryManager mới, không thể khởi tạo được, vì các danh sách cá thể triển khai được loại bỏ khi FactoryManager ban đầu được khởi tạo. Bởi vì nó, các lớp thực hiện không được tìm thấy, do đó IllegalStateException được ném ra.

Giải pháp: sao lưu ClassLoader gốc trước createFient của CXF, lưu URLClassLoader vào một biến và đặt trở lại ClassLoader ban đầu cho Chủ đề. Khi bạn muốn truy cập một lớp động từ CXF, hãy tìm kiếm nó thông qua URLClassLoader bạn đưa vào một biến.

Các vấn đề liên quan