当前位置: 首页 > 知识库问答 >
问题:

带有gradle的泽西测试框架-MessageBodyProviderNotFinder

双恩
2023-03-14

我有一个有点困难的情况。我正在使用泽西提供REST服务。

在我的运行时中,我使用版本1.16.0执行此操作:

restClasspath(
'org.codehaus.jackson:jackson-core-asl:1.9.2',
'org.codehaus.jackson:jackson-mapper-asl:1.9.2',
'com.sun.jersey:jersey-core:1.16.0',
'com.sun.jersey:jersey-server:1.16.0',
)

这是我的资源类:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import ....model.DecisionTree;
import ...model.TestDataProvider;

@Path("new_rest")
public class NewPublicAPIRestResource {

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  @Path("ppp/{param}")
  public Response getHello(@PathParam("param") String treeName) {
      DecisionTree tree = TestDataProvider.createDecisionTree();
      return Response.ok(tree).build();
  }  
}

这是有效的,我得到了预期的json响应。

现在我找到了一个为集成测试提供内存服务器的杰西测试框架。

不幸的是,这似乎只适用于泽西2。x、 所以我为我的测试添加了一个额外的梯度设置:

testClasspath(
'org.glassfish.jersey.core:jersey-common:2.7',
'org.glassfish.jersey.core:jersey-server:2.7',
'org.glassfish.jersey.core:jersey-client:2.7',
'org.glassfish.hk2:hk2:2.2.0',
'org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-inmemory:2.7',    
 )

这是我的测试课:

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;    
import ...resource.NewPublicAPIRestResource;

public class ConditionNodeTest extends JerseyTest{

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

    @Test
    public void test() {
        System.out.println(target("new_rest/ppp/param").request().get(String.class));
    }
}

只要我的资源返回字符串,这个设置就可以运行。但是,只要我返回一个响应,如这里的代码所示,我就会得到以下错误:

javax.ws.rs.ProcessingException: Server-side request processing failed with an error.
    ...
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:424)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:667)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:396)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:296)
    at ....model.ConditionNodeTest.test(ConditionNodeTest.java:39)
    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.ParentRunner.run(ParentRunner.java:309)
    ...
Caused by: org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class ....model.DecisionTree, genericType=class ....model.DecisionTree.
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:247)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
    at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:103)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:88)
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1154)
    at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:571)
    at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:378)
    at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:368)
    at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:262)
    ... 44 more

据我所知,我缺少一些将我的类解析为json的提供程序,但我只是不知道是哪一个。我尝试向我的类路径添加一些库,如下所示:

'org.glassfish.jersey.media:jersey-media-jaxb:2.16'
'org.glassfish.jersey.media:jersey-media-json-jackson:2.7

还有其他几个我记不清了,但没有成功。

你知道我这里缺少什么吗?

谢了斯文

共有1个答案

谷德本
2023-03-14

这是正确的

'org.glassfish.jersey.media:jersey-media-json-jackson:2.7'

但是在泽西2.9之前,我们仍然需要向应用程序注册JacksonFeature(如这里所述)。所以就这样做吧

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

哦,顺便说一句,泽西岛1号。x还有Jersey测试框架。只是API有点不同,但它的功能还是一样的。请参阅这里和这里的示例,这里是内存提供程序。但无论如何,我建议坚持穿球衣2。x。

 类似资料:
  • 我正在使用Jersey编写REST web服务,并尝试编写一组单元测试,以使用Jersey测试框架测试该服务。 然而,我使用HTTP身份验证和SecurityContext作为我的web服务的一部分,我在设置JTF以允许我测试这些方面时遇到了问题。我可以在请求中发送身份验证信息,但如何配置它以了解我希望设置的不同角色和用户? 我目前正在使用Jetty(通过JettyTestContainerFac

  • 我正在尝试使用hk2 DI在泽西岛,我已经读了一些关于这件事的文本。(我想大多数已经过时了)目前我有一个扩展ResourceConfig的类: 更新: 我应该添加我将应用程序包添加到web.xml中的扫描路径:

  • 测试框架工具 Karma Intern NightWatch.js

  • 我正在从事一个用Jersey 2(用于RESTAPI)和Spring(用于DI)实现的REST项目,我想编写功能/集成测试。我尝试使用JerseyTest框架并使用真实的数据库进行这些测试。我唯一想模拟的是我的应用程序使用的远程Web服务(SOAP),为此我应该模拟生成的WS客户端。 在花了大量时间研究Jersey2和Spring的JerseyTest框架之后,似乎不可能为集成测试设置该框架。你能

  • 我在泽西(从文档中)创建了这个测试,它运行良好,但有一个问题:没有被调用。 我需要测试的资源类依赖于ServletContextListener在ServletContext上设置的属性。 我可以确保它被调用吗,或者我可以用其他方式操纵ServletContext吗? 我添加了这些依赖项来实现这一点:

  • 我试图在Jersey测试类中注入一个由HK2工厂服务提供的对象,但得到未满足的依赖项异常。 MultiException有3个异常。它们是: org.glassfish.hk2.api.unsatifiedDependencyException:在SystemInjecteeImpl(requiredtype=closeableService,parent=TestFactory,qualifie