0

ここにあるJerseyチュートリアルの例を試してAsyncResponseみました: http://jersey.java.net/apidocs/snapshot/jersey/javax/ws/rs/container/AsyncResponse.html

うまくいかないようです。この例でも、単純な単体テストで実行すると例外がスローされます。

public class AsyncTest extends JerseyTest {

    @Override
    protected Application configure() {
        return new ResourceConfig(MyAsync.class)
    }

    @Path("/async")
    public static class MyAsync {
        @GET
        public void asyncGet(@Suspended final AsyncResponse asyncResponse) {

            new Thread(new Runnable() {
                @Override
                public void run() {
                    String result = veryExpensiveOperation();
                    asyncResponse.resume(result);
                }

                private String veryExpensiveOperation() {
                    return "bla";
                }
            }).start();
        }
    }

    @Test
    public void testConvertWordToPdf() throws Exception {
        String result = target().path("async").request().async().get().get(String.class);
    }
}

誰かが私が間違っていることを教えてもらえますか? 答えてくれてありがとう!

更新: http://search.maven.org/#artifactdetails|org.glassfish.jersey.examples|server-async-standalone-webapp|2.1|warにある公式の例も試してみましたが、同じ結果が得られました例外。AsyncResponseメソッドが戻る前に応答することを確認すれば、この例は機能します。私が得るスタックトレース:

java.util.concurrent.ExecutionException: javax.ws.rs.ProcessingException: java.lang.NullPointerException at com.google.common.util.concurrent.AbstractFuture$Sync.getValue(AbstractFuture.java:306) at com.google.common .util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:293) で com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:116) で MyCompany.jersey.ConverterResourceTest.testTest(MyClass.java) :20) で sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) で sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) で sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) で java.lang. Reflect.Method.invoke(Method.java:597) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84) org.testng.internal.Invoker.invokeMethod(Invoker.java:714) で org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) で org.testng.internal.Invoker.invokeTestMethods(Invoker.java) :1231) org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) で org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) で org.testng.TestRunner.privateRun(TestRunner.java: 767) org.testng.SuiteRunner.run(TestRunner.java:617) で org.testng.SuiteRunner.runTest(SuiteRunner.java:334) で org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) で org. testng.SuiteRunner.privateRun(SuiteRunner.java:291) で org.testng.SuiteRunner.run(SuiteRunner.java:240) で org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) で org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224) at org.testng.TestNG.runSuitesLocally(TestNG.java:1149) at org.testng.TestNG.run(TestNG.java) :1057) org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111) で org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204) で org.testng.remote.RemoteTestNG.main(RemoteTestNG. java:175) org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:111) で 原因: javax.ws.rs.ProcessingException: java.lang.NullPointerException at org.glassfish.jersey.client.ClientRuntime$1$1.failure( ClientRuntime.java:148) で org.glassfish.jersey.test.inmemory.internal.InMemoryConnector$3.run(InMemoryConnector.java:265) で java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439) でjava.util.com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors. java:293) com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:49) で org.glassfish.jersey.test.inmemory.internal.InMemoryConnector.apply(InMemoryConnector.java:257) で org .glassfish.jersey.client.ClientRuntime$1.run(ClientRuntime.java:156) at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) at org.glassfish.jersey.internal.Errors$1. call(Errors.java:267) at org.glassfish.jersey.internal.Errors.process(Errors.java:315) at org.glassfish.jersey.internal.Errors.process(Errors.java:297) at org.glassfish 。ジャージー。internal.Errors.process(Errors.java:267) で org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:322) で org.glassfish.jersey.client.ClientRuntime$2.run(ClientRuntime.java) :170) java.util.concurrent.FutureTask. run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at java.lang .Thread.run(Thread.java:662) 原因: java.lang.NullPointerException at org.glassfish.jersey.internal.util.KeyComparatorHashMap.putAll(KeyComparatorHashMap.java:509) at javax.ws.rs.core.AbstractMultivaluedMap .org.glassfish.jersey.test.inmemory.internal.InMemoryConnector.createClientResponse(InMemoryConnector.java:286) の putAll(AbstractMultivaluedMap.java:332) org.glassfish.jersey.test.inmemory.internal.InMemoryConnector.apply(InMemoryConnector. java:247) at org.glassfish.jersey.test.inmemory.internal.InMemoryConnector$3.run(InMemoryConnector.java:261) ... 20 詳細

4

1 に答える 1

1

ところで、このテストケースを Grizzly コンテナーでテストしました。コンテナは ContainerResponseWriter でサスペンド操作を実装していないため、InMemory コンテナではサポートされていません。InMemoryResponseWriter は、false を返す代わりに UnsupportedOperationException をスローする必要があります。これはジャージーのバグのように聞こえます。

@Test
public void testConvertWordToPdf() throws Exception {
    String result = target().path("async").request().async().get().get().readEntity(String.class);
    assertEquals("bla", result);
}

これが私のPOM依存関係です:

    <dependency>
        <groupId>org.glassfish.jersey.test-framework.providers</groupId>
        <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
        <version>2.1</version>
        <scope>test</scope>
    </dependency>
于 2013-08-12T20:09:15.737 に答える