2

このようなテストコードがいくつかあります...

    @Test
    public void testCreateWasteApprovalApplication() {
        final ManualWasteApprovalApplicationDto dto = new ManualWasteApprovalApplicationDto();
        dto.setDate(Instant.now().getMillis());
        dto.setWasteGeneratorName("wasteGeneratorName");
//... set a bunch more properties
        dto.setFacilityGroup("facgroup12");
        final Entity<ManualWasteApprovalApplicationDto> entity = Entity.entity(dto, MediaType.APPLICATION_JSON_TYPE);
        Response response = target("wasteapproval/1").request(MediaType.APPLICATION_JSON).put(entity);
        assertNotNull(response);
    }

これを Jersey Test 内で実行しようとすると、次のスタック トレースが表示されます。

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class com.tervita.portal.wasteapproval.controller.ManualWasteApprovalApplicationDto, genericType=class com.tervita.portal.wasteapproval.controller.ManualWasteApprovalApplicationDto.

    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:227)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:149)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1139)
    at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:495)
    at org.glassfish.jersey.client.HttpUrlConnector._apply(HttpUrlConnector.java:270)
    at org.glassfish.jersey.client.HttpUrlConnector.apply(HttpUrlConnector.java:182)
    at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:227)
    at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:655)
    at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:652)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:422)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:652)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:412)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.put(JerseyInvocation.java:306)
    at com.tervita.portal.wasteapproval.service.WasteApprovalApplicationControllerTest.testCreateWasteApprovalApplication(WasteApprovalApplicationControllerTest.java:54)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)

これは、ジャージ テストを実行するときに Java オブジェクトを json にマーシャリングするための有効な手法ですか? ある種の JSON マーシャラーを登録する必要がありますか?

既存のジャージー サービスで呼び出しているメソッドには、このメソッド シグネチャがあります...

@POST
@Path("{id}")
public ManualWasteApprovalApplication updateApplication(@PathParam("id") Long id, ManualWasteApprovalApplicationDto dto) {
4

1 に答える 1

2

まだ持っていない場合は、JSON プロバイダーが必要です。ジャクソンを使用するだけです。

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey2.version}</version>
</dependency>

これは、サーバーとクライアントの両方に登録する必要があります。2.8 よりも新しい (つまり 2.9+) バージョンの Jersey を使用している場合は、何も登録する必要はありません。自動的に登録されるはずです。古いバージョンを使用している場合は、JacksonFeature.

クライアントのために

@Override
public void configureClient(ClientConfig config) {
    config.register(JacksonFeature.class);
}

サーバー用

@Override
public Application configure() {
    return new ResourceConfig(...).register(JacksonFeature.class);
}

Maven を使用していない場合は、この投稿をご覧ください

于 2016-02-23T00:42:01.590 に答える