当前位置: 首页 > 面试题库 >

自省Jersey资源模型Jersey 2.x

越扬
2023-03-14
问题内容

我已经编写了自己的扫描器来浏览我的JAX-RS资源,并使用来打印出方法名称和路径jersey- server-1.18.1。问题是,当我将相同的代码迁移到2.16(将包名称从更改com.sun.*org.glassfish.*)时,它将无法正常工作。

深入研究发现,这些必修jersey-server课程不再公开。有人知道原因吗?以及如何将下面的代码从1.x迁移到2.x?实际上,没有有关此迁移的文档。

所有帮助表示赞赏!下面是带有1.x的代码

import com.wordnik.swagger.annotations.ApiOperation;
import com.sun.jersey.api.model.AbstractResource;
import com.sun.jersey.api.model.AbstractResourceMethod;
import com.sun.jersey.api.model.AbstractSubResourceLocator;
import com.sun.jersey.api.model.AbstractSubResourceMethod;
import com.sun.jersey.server.impl.modelapi.annotation.IntrospectionModeller;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author shivang
 */
public class Apiscanner {
    public static void main(String[] args) {
        Apiscanner runClass = new Apiscanner();
        runClass.xyz();
    }

    public void xyz() {
        AbstractResource resource = IntrospectionModeller.createResource(BaseResource.class);
        String uriPrefix = resource.getPath().getValue();
        abc(uriPrefix, resource);
    }

    public void abc(String uriPrefix, AbstractResource resource) {
        for (AbstractResourceMethod srm : resource.getResourceMethods()) {
            String uri = uriPrefix;
            System.out.println(srm.getHttpMethod() + "\t" + uri);
        }
        for (AbstractSubResourceMethod srm : resource.getSubResourceMethods()) {
            String uri = uriPrefix + srm.getPath().getValue();
            ApiOperation op = srm.getAnnotation(ApiOperation.class);
            System.out.println(srm.getHttpMethod() + "\t" + uri);
        }
        if (resource.getSubResourceLocators() != null && !resource.getSubResourceLocators().isEmpty()) {
            for (AbstractSubResourceLocator subResourceLocator : resource.getSubResourceLocators()) {
                ApiOperation op = subResourceLocator.getAnnotation(ApiOperation.class);
                AbstractResource childResource = IntrospectionModeller.createResource(op.response());
                String path = subResourceLocator.getPath().getValue();
                String pathPrefix = uriPrefix + path;
                abc(pathPrefix, childResource);
            }
        }
    }
}

问题答案:

可以在org.glassfish.jersey.server.model包中找到适用于Jersey 2.x的新API 。

我可以想到的一些等效项:

  • AbstractResource == Resource

  • IntrospectionModeller.createResource ==我相信 Resource.from(BaseResource.class)

  • AbstractResourceMethod == ResourceMethod

  • resource.getSubResourceMethods()== getChildResources(),实际上只返回一个List<Resource>

  • AbstractSubResourceLocator==似乎不存在。我们只需检查上面的子资源,看看它是否是定位器

    for (Resource childResource: resource.getChildResources()) {
    if (childResource.getResourceLocator() != null) {
        ResourceMethod method = childResource.getResourceLocator();
        Class locatorType = method.getInvocable().getRawResponseType();
    }
    

    }

您还可以使用枚举ResourceMethod.JaxrsType.SUB_RESOURCE_LOCATOR检查它是否等于ResourceMethod.getType()

    if (resourceMethod.getType()
        .equals(ResourceMethod.JaxrsType.SUB_RESOURCE_LOCATOR) {

}

这就是我能想到的,以匹配您所得到的。

import com.wordnik.swagger.annotations.ApiOperation;
import org.glassfish.jersey.server.model.Resource;
import org.glassfish.jersey.server.model.ResourceMethod;

public class ApiScanner {
    public static void main(String[] args) {
        ApiScanner scanner = new ApiScanner();
        scanner.xyz();
    }

    public void xyz() {
        Resource resource = Resource.from(BaseResource.class);
        abc(resource.getPath(), resource);
    }

    public void abc(String uriPrefix, Resource resource) {
        for (ResourceMethod resourceMethod: resource.getResourceMethods()) {
            String uri = uriPrefix;
            System.out.println("-- Resource Method --");
            System.out.println(resourceMethod.getHttpMethod() + "\t" + uri);
            ApiOperation api = resourceMethod.getInvocable().getDefinitionMethod()
                                                .getAnnotation(ApiOperation.class);
        }

        for (Resource childResource: resource.getChildResources()) {
            System.out.println("-- Child Resource --");
            System.out.println(childResource.getPath() + "\t" + childResource.getName());

            if (childResource.getResourceLocator() != null) {
                System.out.println("-- Sub-Resource Locator --");
                ResourceMethod method = childResource.getResourceLocator();
                Class locatorType = method.getInvocable().getRawResponseType();
                System.out.println(locatorType);
                Resource subResource = Resource.from(locatorType);
                abc(childResource.getPath(), subResource);        
            }
        }
    }
}


 类似资料:
  • 目前,我们支持 FBX 和 glTF 两种格式的模型文件。关于如何从第三方工具导出这两种模型文件,可以参考这里。 模型导入 从外部导入编辑器中后,在 资源管理器 中可得到对应的模型资源文件,其目录结构如下:(以 glTF 文件为例,fbx 文件相同) 无动画的模型文件结构如下: 包含动画的模型文件结构如下: 其中: .material 文件为材质文件 .mesh 文件为模型文件 .texture

  • 文:youyou 目前 Cocos Creator 支持导入的 3D 模型格式为使用非常广泛的 .fbx,基本上 3D 建模软件都支持导出这种格式。 导入的流程很简单,只需要将 .fbx 模型资源拖入到 资源管理器,等待片刻即可完成导入工作。导入完成后,在 资源管理器 中看到导入后的模型资源是一个可以展开的文件夹,导入模型的时候编辑器会自动解析模型的内容,并生成 Prefab、网格、骨骼动画 等资

  • 问题内容: 当我仅知道字段名称和模型名称(均为纯字符串)时,我试图获取模型内部字段上的类信息。这怎么可能? 我可以动态加载模型: 现在我有一个字段-‘myfield’-如何获取该字段的类? 如果字段是关系字段-如何获取相关字段? 谢谢一群! 问题答案: 您可以使用模型的属性来获取字段对象,并且可以从字段中获取关系以及更多其他信息,例如,考虑一个雇员表,该雇员表具有一个部门表的外键 来自django

  • 我正在使用Dropwizard 8.2.0构建REST服务。我有2个资源:FolderResource和FileResource: 我做错了什么?

  • 以资源类型的维度展示每个资源类型的费用分析情况。 以资源类型的维度展示每个资源类型的费用分析情况. 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “费用/费用分析/资源类型” 菜单项,进入资源类型菜单项。 查看资源类型的费用 该功能用于查看系统中所有资源类型的费用情况。 在资源类型列表中默认展示系统中每个资源类型的本月消费和本年消费,支持单击顶部图标查看本月、上月、本季度、上季度、

  • 问题内容: 在Jersey REST服务器[1]上的教程谈到了Jersey servlet: 该servlet分析传入的HTTP请求,并选择正确的类和方法来响应此请求。该选择基于类和方法中的注释。 当servlet“选择正确的类和方法”时,是否每次都会重新实例化该类?还是保留每个资源类的一个实例? 这似乎很重要,因为如果这些资源类引用了存储应用程序范围状态的对象,则这些状态对象将与资源一起重新实例