2013-08-03 85 views
0

我正在使用Grizzly作爲Web服務器來與澤西島一起創建獨立的REST服務。我也想在應用程序中使用Spring IoC,但遇到了自動佈線Bean的問題。灰熊,澤西島和Spring自動佈線問題

要創建我在main()方法運行該服務器:

HttpServer server = null; 

try { 
    ResourceConfig rc = new PackagesResourceConfig(""); 
    ConfigurableApplicationContext cac = new ClassPathXmlApplicationContext("classpath*:/spring-context.xml");   
    IoCComponentProviderFactory factory = new SpringComponentProviderFactory(rc, 

    server = GrizzlyServerFactory.createHttpServer("http://localhost:5555", rc, factory); 
    System.in.read(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 
    try { 
     if (server != null) { 
      server.stop(); 
     } 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
} 

我的彈簧context.xml中包含略低於:

<context:annotation-config /> 
<context:component-scan base-package="com.test"/> 

我想自動線BO對象在我的澤西資源類:

@Path("/test") 
@Service 
public class Test { 

    @Autowired 
    private testBO testBo; 
    .... 

    @GET 
    @Path("/info") 
    public String getInfo() { 
     return testBo.get(); 
    } 

} 

現在,無論何時我調用引用testBo的Test類中的方法,我得到NullPointerException,我認爲這意味着該bean不是自動連線的。

testBO類具有@Component註釋。所有相關的bean都是「com.test」包或其子包的一部分。

任何人都知道我做錯了什麼?

至於NullPointerException異常以下要求堆棧跟蹤:

java.lang.NullPointerException 
    at com.test.Test.getInfo(Test.java:27) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) 
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185) 
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) 
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) 
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) 
    at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer._service(GrizzlyContainer.java:215) 
    at com.sun.jersey.server.impl.container.grizzly2.GrizzlyContainer.service(GrizzlyContainer.java:185) 
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:162) 
    at org.glassfish.grizzly.http.server.HttpHandlerChain.service(HttpHandlerChain.java:195) 
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:162) 
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:160) 
    at org.glassfish.grizzly.filterchain.ExecutorResolver$3.execute(ExecutorResolver.java:95) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:444) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:364) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:290) 
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:133) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:76) 
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:63) 
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:823) 
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:116) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$000(WorkerThreadIOStrategy.java:55) 
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$1.run(WorkerThreadIOStrategy.java:98) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:508) 
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:488) 
    at java.lang.Thread.run(Thread.java:662) 

我也看到,在控制檯輸出:

03-Aug-2013 17:46:33 org.springframework.context.support.AbstractApplicationContext prepareRefresh 
INFO: Refreshing org[email protected]131f71a: startup date [Sat Aug 03 17:46:33 BST 2013]; root of context hierarchy 
03-Aug-2013 17:46:33 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 
INFO: Pre-instantiating singletons in org.s[email protected]1971afc: defining beans []; root of factory hierarchy 
+0

能否請您分享'NullPointerException異常的詳細的日誌'? – iNan

+0

我已經包括了這一點。謝謝 – Zyga

+0

對不起,延遲迴復,你的應用程序上下文是否被加載? – iNan

回答

0

如果你對Java 8 - 可能是值得在Microserver考慮看看。

它提供了整合Grizzly,Jersey 2和Spring 4.0的基礎設施。如果你的主要方法是在com.test包,那麼你需要的是: -

public static void main(String[] args){ 

    new MicroserverApp(()->"context").run(); 

} 

否則,你也應該標註你的主類

@Microserver(basePackages={"com.test"})