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

自定义消息在泽西岛找不到正文阅读器测试

艾照
2023-03-14

我的球衣测试课有一个奇怪的问题。

当执行我的测试代码并在org.glassfish.jersey.message.internal.ReaderInterceptorExecutor的第203行放置断点时,我看到我的阅读器不在reader.workers.但是,正如您在下面看到的,我在ResourceConfig中注册了这个MessageBodyReader。

所有相关代码如下所示。

@Provider
@Produces({V1_JSON})
@Consumes({V1_JSON})
public class JsonMessageBodyHandlerV1
    implements
      MessageBodyWriter<Object>,
      MessageBodyReader<Object> {
  ...
}

是的,可读的返回为真。

调试时,我看到代码点击了writeTo,但没有点击readFrom

public class TestLocationResource extends JerseyTest {

  public static class LocationResourceHK2Binder extends AbstractBinder {

    @Override
    protected void configure() {
      // Singleton bindings.
      bindAsContract(LocationDao.class).in(Singleton.class);

      // Singleton instance bindings.
      bind(new FakeLocationDao()).to(LocationDao.class);
    }
  }

  @Test
  public void basicTest() {

    LocationListV1 actualResponse = /**/
    /**/target(LocationResourceV1.PathFields.PATH_ROOT)
    /*   */.path(LocationResourceV1.PathFields.SUBPATH_LIST)
    /*   */.request(V1_JSON)
    /*   */.header(HEADER_API_KEY, "abcdefg")
    /*   */.get(LocationListV1.class);

    assertEquals(10, actualResponse.getLocations().size());
  }

  @Override
  protected Application configure() {
    enable(TestProperties.LOG_TRAFFIC);
    enable(TestProperties.DUMP_ENTITY);

    ResourceConfig rc = new ResourceConfig();
    rc.registerClasses(LocationResourceV1.class, JsonMessageBodyHandlerV1.class);
    rc.register(new LocationResourceHK2Binder());

    return rc;
  }
}

(从这个例子中得出。)

public class LocationResourceV1 implements ILocationResourceV1 {
  ...

  @Inject
  private LocationDao daoLoc;

  private final LocationTranslator translator = new LocationTranslator();

  @Override
  public LocationListV1 listV1(String apiKey) {
    return translator.translate(daoLoc.query(LocationFilters.SELECT_ALL));
  }

  ...

  @VisibleForTesting
  public void setLocationDao(LocationDao dao) {
    this.daoLoc = dao;
  }
}

(请注意,Web 服务注释(如@GET)位于接口中。

org . glassfish . jersey . message . internal . messagebodyprovidernotfoundexception:找不到MessageBodyReader for media type = application/vnd . com . company-v1 JSON,type = class com . company . rest . v1 . resources . location . JSON . location listv1 . at org . glassfish . jersey . message . internal . readerinterceptorexecutor$termineralreaderinterceptor . around readfrom(readerinterceptorexexe...]

[...]
INFO: [HttpServer] Started.
Oct 29, 2013 4:26:16 PM org.glassfish.jersey.filter.LoggingFilter log
INFO: 1 * LoggingFilter - Request received on thread main
1 > GET http://localhost:9998/location/list
1 > Accept: application/vnd.com.company-v1+json
1 > X-ApiKey: abcdefg

Oct 29, 2013 3:30:21 PM org.glassfish.jersey.internal.Errors logErrors
WARNING: The following warnings have been detected: WARNING: HK2 service reification failed for [com.company.persistence.dao.intf.LocationDao] with an exception:
MultiException stack 1 of 2
java.lang.NoSuchMethodException: Could not find a suitable constructor in com.company.persistence.dao.intf.LocationDao class.
    at org.glassfish.jersey.internal.inject.JerseyClassAnalyzer.getConstructor(JerseyClassAnalyzer.java:189)
    at org.jvnet.hk2.internal.Utilities.getConstructor(Utilities.java:159)
    at org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:125)
    at org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:176)
    at org.jvnet.hk2.internal.SystemDescriptor.internalReify(SystemDescriptor.java:649)
    at org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java:604)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.reifyDescriptor(ServiceLocatorImpl.java:396)
    [...]
MultiException stack 2 of 2
java.lang.IllegalArgumentException: Errors were discovered while reifying SystemDescriptor(
    implementation=com.company.persistence.dao.intf.LocationDao
    contracts={com.company.persistence.dao.intf.LocationDao}
    scope=org.glassfish.jersey.process.internal.RequestScoped
    qualifiers={}
    descriptorType=CLASS
    descriptorVisibility=NORMAL
    metadata=
    rank=0
    loader=org.glassfish.hk2.utilities.binding.AbstractBinder$2@568bf3ec
    proxiable=null
    proxyForSameScope=null
    analysisName=null
    id=143
    locatorId=0
    identityHashCode=2117810007
    reified=false)
    at org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java:615)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.reifyDescriptor(ServiceLocatorImpl.java:396)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.narrow(ServiceLocatorImpl.java:1916)
    at org.jvnet.hk2.internal.ServiceLocatorImpl.access$700(ServiceLocatorImpl.java:113)
    at org.jvnet.hk2.internal.ServiceLocatorImpl$6.compute(ServiceLocatorImpl.java:993)
    at org.jvnet.hk2.internal.ServiceLocatorImpl$6.compute(ServiceLocatorImpl.java:988)
    [...]
    [...]
    (Above is repeated 4 times)
    [...]
    [...]
Oct 29, 2013 3:30:22 PM org.glassfish.jersey.filter.LoggingFilter log
INFO: 2 * LoggingFilter - Response received on thread main
2 < 200
2 < Date: Tue, 29 Oct 2013 22:30:21 GMT
2 < Content-Length: 16
2 < Content-Type: application/vnd.com.company-v1+json
{"locations":[]}

Oct 29, 2013 3:30:22 PM org.glassfish.jersey.test.grizzly.GrizzlyTestContainerFactory$GrizzlyTestContainer stop
INFO: Stopping GrizzlyTestContainer...
Oct 29, 2013 3:30:22 PM org.glassfish.grizzly.http.server.NetworkListener stop
INFO: Stopped listener bound to [localhost:9998]

有人知道我做错了什么吗?

共有1个答案

何雅惠
2023-03-14

第一个堆栈跟踪来自您的客户端,因为您没有在那里注册消息正文提供程序(因此找不到它)。泽西测试#配置方法应该仅用于配置服务器端。还有另一种名为“泽西测试#配置客户端”的方法,用于客户端。如果要使用自定义提供程序,则需要重写这两种方法。

第二个堆栈跟踪来自您的< code > locationresourcehk 2 binder 。经过

bindAsContract(LocationDao.class).in(Singleton.class);

您告诉HK2,LocationDao类应该实例化为单例,然后HK2将其注入LocationDaotypes。您可能希望更改活页夹以使用以下内容:

bind(new FakeLocationDao()).to(LocationDao.class);

有关此主题的详细信息,请参阅自定义注入和生命周期管理。

 类似资料:
  • 我一直在写RESTful Web服务。我使用的技术: 玻璃鱼3(基于Java6) JDK v7 Eclipse EE Kepler 泽西岛(Glassfish的一部分) 我为自定义MediaType创建了自定义POJO: 我的资源方法: 我的邮件正文作者: } 我的服务客户: 根路径: } 当我运行应用程序时,我从我的服务客户端获得以下输出: 我想使用自定义媒体类型和,以便更好地了解RESTful

  • 问题内容: 我是Web服务的新手,因此我从基本示例开始。这与文件上传有关。我正在为非Maven开发人员使用最新(2.17)版本的Jersey捆绑包。它指出: 捆绑包包含JAX-RS 2.0 API jar,所有核心Jersey模块jar以及所有必需的3rd-party依赖关系 。问题是我无法编译此部分: 尽管文档说确实存在,但似乎在Jersey 2.17软件包中并不存在。2.17捆绑包是否不完整?

  • 问题内容: 在尝试找出我的问题之后,我终于决定问您如何解决我的问题。我见过不同的人有相同的问题,我尝试了所有建议他们做的事情,但没有任何帮助解决我的问题。所以基本上我有一个使用Jersey进行构建的RESTful服务。对于我的客户,我想返回JSON格式的对象。我通读了不同的教程,并决定使用jersey- json-1.8库是有意义的。我像往常一样将所有内容添加到我的项目中,并尝试运行它,但是每次调

  • 我有一个基于令牌的用户身份验证的Jersey REST应用程序。当请求传入时,会创建一个自定义的对象,并将其作为一个属性添加到 的用法,我想知道是否可以使用injection将这个< code>RestContext注入到我的资源和其他过滤器中(例如,我有一个过滤器,它从< code>RestContext中创建一个< code>SecurityContext),但是我找不到答案。一般来说,我如何

  • 我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?