资源服务(Resource Service)

Spring5:@Autowired注解、@Resource注解和@Service注解 阅读详情

    资源服务是用来管理资源和资源库的一种服务,它提供了四类API。

  • 管理资源库的API
  • 管理资源的API
  • 管理资源数据的API
  • 管理资源包的API

    在使用这些API时,经常要使用资源ID来指定一个被操作的资源。如果指定的是文档,那么资源ID的扩展名必须与资源类型一致。例如:如下的资源ID必须是一个指向地图定义的资源。
    $resourceID = new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    如果指定资源是文件夹,那么资源ID必须以“/”结尾。例如:
    $resourceID = new MgResourceIdentifier("Library://Geography/");

1. 获取资源服务
    MapGuide中使用MgResourceService来代表资源服务。MgResourceService是一个接口,你无法直接创建MgResourceService的实例。如果大家看看MapGuide的源代码,你就会发现MapGuide使用了Singleton模式来创建MgResourceService。所以,我们必须使用方法MgSiteConnection::CreateService(…)来创建一个MgResourceService的实例,调用这个方法返回的结果始终是同一个MgResourceService的实例。如下的代码示意了如何获取一个资源服务。
    // 初始化WebTier
    MgInitializeWebTier('C://Inetpub//wwwroot//PhpMapAgent//webconfig.ini');
    // 创建到MapGuide站点服务器的一个连接
    $user = new MgUserInformation('Administrator', 'admin');
    $siteConnection = new MgSiteConnection();
    $siteConnection->Open($user);
    // 获取资源服务
    $resourceService = $siteConnection->CreateService(MgServiceType::ResourceService);
2. 头(Header)
    每个资源库和资源都有一个XML格式的头(Header),它包含了访问这些项目的权限设置信息。MapGuide包含了两种类型的头,ResourceFolderHeader和ResourceDocumentHeader。ResourceFolderHeader用于设置文件夹资源或资源库的权限,ResourceDocumentHeader用于设置其它类型资源的图标、权限和元数据。

    如果使用下面的ResourceFolderHeader设置资源库或文件夹资源的权限,那么所有用户都可以读取和修改此资源库或文件夹资源。
    <?xml version="1.0" encoding="UTF-8"?>
    <ResourceFolderHeader xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
      xsi:noNamespaceSchemaLocation="ResourceFolderHeader-1.0.0.xsd">
        <Security>
            <Inherited>false</Inherited>
            <Groups>
                <Group>
                    <Name>Everyone</Name>
                    <Permissions>r,w</Permissions>
                </Group>
           </Groups>
       </Security>
    </ResourceFolderHeader>

3. 管理资源库
    资源服务提供了获取和修改资源库内容和头的API。
3.1 获取资源库的内容
    方法GetRepositoryContent(…)用于获取指定资源库的内容。参数resource用于指定一个资源库,它可以是Library或Session资源库。返回值返回一个使用RepositoryContent XML Schema的XML字节流,它描述了指定资源库中的内容。
    MgByteReader GetRepositoryContent(MgResourceIdentifier resource);
    如下的代码示意了如何返回一个资源库的内容。
    $resourceID = new MgResourceIdentifier("Library://");
    $byteReader = $resourceService->GetRepositoryContent($resourceID);
    echo $byteReader->ToString();
3.2 获取资源库的头
    方法GetRepositoryHeader(…)用于获取指定资源库的头。参数resource用于指定一个资源库。返回值是一个使用ReourceFolderHeader XML Schema的XML字节流,它描述了指定资源库的头。
    MgByteReader GetRepositoryHeader(MgResourceIdentifier resource);
    如下的代码示意了如何返回一个资源库的头。
    $resourceID = new MgResourceIdentifier("Library://");
    $byteReader = $resourceService->GetRepositoryHeader($resourceID);
    echo $byteReader->ToString();
3.3 更新资源库
    方法UpdateRepositoryHeader(…)用于更新指定资源库的内容和头部。参数resource用于指定一个资源库,参数content用于指定资源库的内容,参数header用于指定资源库的头部。

    void UpdateRepository (MgResourceIdentifier resource,
                                          MgByteReader content,
                                          MgByteReader header);
    如下的代码示意了如何更新资源库。
    $resourceID = new MgResourceIdentifier('Library://');
    $byteSource = new MgByteSource('C:DataRepositoryContent.xml');
    $byteReader = $byteSource->GetReader();
    $resourceService->UpdateRepository($resourceID, $byteReader, null);

3.4 管理资源
    资源服务提供了API用于枚举资源及其所引用的资源,获取、修改资源的内容、头和元数据,拷贝、删除和移动资源等。
3.4.1 枚举资源
    方法EnumerateResources(…)用于枚举资源库中指定类型的资源。参数resource用于指定一个需要枚举的资源,它可以是一个资源文档,也可以是一个资源文件夹。参数depth用于相对于指定资源的递归深度。

  • 如果资源是一个文档,那么depth必须为0。
  • 如果资源是一个文件夹:
    • 如果depth等于0,那么只返回指定文件夹的信息。
    • 如果depth大于0,那么返回指定文件夹及其depth层子孙的信息。
  • 如果depth等于-1,那么返回文件夹及其所有子孙的信息。

    参数type用于指定需要枚举的资源,它可以是MgResourceType中定义的任意一种资源类型。如果type设置为NULL,那么枚举所有的资源类型。返回值是一个使用ReourceList XML Schema的XML字节流,它描述了所有枚举得到的资源。
    MgByteReader* EnumerateResources(MgResourceIdentifier* resource,
                                                                INT32 depth,
                                                                CREFSTRING type);
    如下的代码示意了如何结合不同的参数来枚举资源库中的资源。
    // 枚举Library资源库中的所有资源。
    $resourceID = new MgResourceIdentifier("Library://");
    $byteReader = $resourceService->EnumerateResources($resourceID, -1, "");
    // 枚举Library资源库Geography文件夹下的所有资源,包含它的子文件夹下的资源。
    $resourceID = new MgResourceIdentifier("Library://Geography/");
    $byteReader = $resourceService->EnumerateResources($resourceID, -1, "");
    // 枚举Library资源库中的所有地图定义资源。
    $resourceID = new MgResourceIdentifier("Library://");
    $byteReader = $resourceService->EnumerateResources($resourceID, -1, "MapDefinition");
    // 枚举Library资源库中的所有文件夹资源。
    $resourceID = new MgResourceIdentifier("Library://");
    $byteReader = $resourceService->EnumerateResources($resourceID, -1, "Folder");
    // 枚举Library资源库Geography文件夹资源,不包含文件夹下的资源。
    $resourceID = new MgResourceIdentifier("Library://Geography/");
    $byteReader = $resourceService->EnumerateResources($resourceID, 0, "Folder");
    // 枚举Library资源库Geography文件夹,及文件夹下一层的所有地图定义资源,
    // 不包含文件夹下的文件夹下的资源。。
    $resourceID = new MgResourceIdentifier("Library://Geography/");
    $byteReader = $resourceService->EnumerateResources($resourceID, 1, "MapDefinition");
    // 枚举特定的地图定义资源。此时,depth必须设置为0。
    $resourceID = new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    $byteReader = $resourceService->EnumerateResources($resourceID, 0, "MapDefinition");

3.4.2 枚举引用
    方法EnumerateReferences(…)用于枚举引用了指定资源的所有资源。参数resource用于指定一个需要枚举其引用的资源。返回值是一个使用ReourceReferenceList XML Schema的XML字节流,它描述了资源的所有引用。
    MgByteReader EnumerateReferences(MgResourceIdentifier resource);
    如下的代码示意了如何枚举资源的数据。
    $resourceID= new MgResourceIdentifier('Library://Samples/Sheboygan/Layers/BuildingOutlines.LayerDefinition');
    $byteReader = $resourceService->EnumerateReferences($resourceID);
    echo $byteReader->ToString();
    执行上面的代码,会得到类似如下的XML。
    <?xml version="1.0" encoding="UTF-8"?>
    <ResourceReferenceList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="ResourceReferenceList-1.0.0.xsd">
        <ResourceId>Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition</ResourceId>
    </ResourceReferenceList>
3.4.3 获取资源相关的信息
    方法GetResourceContent(…)用于获取指定资源的内容。所有资源的内容都是XML格式的。对于不同类型的资源,它的XML Schema是不同的。你可以使用MgResourceIdentifier::GetResourceType ()得到资源类型,从而根据其相应的XML Schema分析和解释资源内容。
    MgByteReader GetResourceContent(MgResourceIdentifier resource);
    如下的代码示意了如何获取一个地图定义资源的内容。
    $resourceID = new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    $byteReader = $resourceService->GetResourceContent($resourceID);
    方法GetResourceHeader(…)用于获取指定资源的头。返回值返回一个使用ReourceDocumentHeader XML Schema的XML字节流,它描述了指定资源的头。
    MgByteReader GetResourceHeader(MgResourceIdentifier resource);
    如下的代码示意了如何获取一个地图定义资源的头。
    $resourceID = new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    $byteReader = $resourceService->GetResourceHeader($resourceID);
    方法GetResourceMetadata(…)用于获取指定资源的元数据。返回值返回一个代表资源元数据的XML字节流。如果没有关联到资源的元数据,此方法返回NULL。一般情况下,我们使用FGDC 或ISO格式的元数据。大家可以到登录http://www.fgdc.gov/metadata和http://www.iso.org查看这两种元数据的具体格式。
    MgByteReader GetResourceMetadata(MgResourceIdentifier resource);
    方法GetResourceContent(…)用于检测指定资源是否已经存在。
    bool ResourceExists(MgResourceIdentifier resource);
3.4.4 设置资源
    方法SetResource(…)用于设置指定资源的内容和头。如果指定的资源不存在,则添加此资源;如果指定的资源已经存在,则更新此资源。参数resource用于指定一个资源。参数content用于指定资源的内容,如果不打算设置资源的内容,可以将其设置为NULL。参数header用于指定资源的头,这是一个使用了ReourceFolderHeader或ResourceDocumentHeader XML Schema的XML字节流。如果只是设置资源的内容,可以将header设置为NULL。这时,资源的权限设置继承于其父节点。
    void SetResource(MgResourceIdentifier resource,
                                MgByteReader content,
                                MgByteReader header);
    下面,我们通过添加一个地图定义资源来示意如何添加一个资源。
    1. 准备资源内容。下例中的地图定义由两个图层Cities和Countries组成。
    <?xml version="1.0" encoding="UTF-8"?>
    <MapDefinition version="1.0.0">
       <Name>World</Name> 
       <Layers>
          <Layer>
             <Name>Cities</Name>
             <ResourceId>Library://World/Layers/Cities.Layer</ResourceId>
          </Layer>
          <Layer>
             <Name>Countries</Name>
             <ResourceId>Library://World/Layers/Countries.Layer</ResourceId>
          </Layer>
       </Layers>
    </MapDefinition>
    2. 准备资源头部。下例中,它的权限设置继承自其父节点。
    <?xml version="1.0" encoding="UTF-8"?>
    <ResourceDocumentHeader
      xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
      xsi:noNamespaceSchemaLocation="ResourceDocumentHeader-1.0.0.xsd">
        <Security>
            <Inherited>true</Inherited>
        </Security>
    </ResourceDocumentHeader>
    3. 添加资源。
    $resourceID= new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    $content  = "C:DataMapsWorld.MapDefinition";
    $content_byteSource = new MgByteSource($content);
    $content_byteSource->setMimeType("text/xml");
    $content_byteReader = $content_byteSource->GetReader();
    $header   = "C:DataMapsResourceDocumentHeader.xml";
    $header_byteSource = new MgByteSource($header);
    $header_byteSource->setMimeType("text/xml");
    $header_byteReader = $header_byteSource->GetReader();
    $resourceService->SetResource($resourceID, $content_byteReader,
    $header_byteReader);
    4. 如果需要,添加资源所引用的其它资源。此例中,地图定义引用了其它两个图层定义资源。如果这两个资源没有添加到资源库中,我们必须使用类似的步骤将它们添加到资源库。
    5. 如果需要,设置资源数据。此例中,地图定义自身并不需要设置资源数据。但是,如果它所引用的图层定义没有设置相应的资源数据,那么我们需要为图层定义设置相应的资源数据。

3.4.5 设置资源的元数据
    方法SetResourceMetadata(…)用于设置指定资源的元数据。如果指定的资源不存在,那么此方法调用会失败。参数resource用于指定一个需要设置元数据的资源。参数content用于指定资源的元数据。如果设置resource为NULL,那么清除指定资源的元数据。MapGuide没有规定元数据的XML Schema,而是由用户自己来决定。MapGuide对这些元数据不做任何格式的检验,而是将其直接存储在资源库中。一般情况下,我们使用FGDC 或ISO格式的元数据。
    void SetResourceMetadata(MgResourceIdentifier resource, MgByteReader content);
3.4.6 删除资源
    方法DeleteResource(…)用于删除指定资源,及此资源的数据。参数resource用于指定一个需要删除的资源。如果指定的是一个资源文档,那么删除此资源文档。如果指定的是一个资源文件夹,那么此文件夹、此文件夹下的资源文档、此文件夹的子资源文件夹都会被删除。如果试图删除一个不存在的资源,那么此方法会抛出一个异常。
    void DeleteResource(MgResourceIdentifier resource);
    如下的代码示意了如何删除一个地图定义资源。
    $resourceID = new MgResourceIdentifier("Library://Maps/World.MapDefinition");
    $resourceService->DeleteResource($resourceID);
    如下的代码示意了如何删除一个资源文件夹,及此文件夹下的其它资源。
    $resourceID = new MgResourceIdentifier("Library://Maps/");
    $resourceService->DeleteResource($resourceID);
    如下的代码示意了如何删除资源库中的所有资源。
    $resourceID = new MgResourceIdentifier("Library://Maps/");
    $resourceService->DeleteResource($resourceID);
3.4.7 移动资源
    方法MoveResource(…)用于将一个已经存在的资源移到其它位置。参数sourceResource用于指定一个需要移动的资源,它既可以是一个文档,也可以是一个文件夹。如果指定一个资源文件夹,此方法亦拷贝文件夹下的资源。参数destResource用于指定移动的目标位置。参数overwrite用于决定在目标资源存在的情况下是否覆盖它。如果拷贝的是文件夹、 overwrite为真,且目标文件夹已经存在,那么只覆盖目标文件夹下具有相同文件夹名称的子文件夹,其它的文件夹保持原样。
    需要注意的是,此方法有一个缺陷。如果有一些资源引用了的被移动的资源,此方法不会更新这些引用。在MapGuide开源版2.2和MapGuide企业版2011中,此即将修正此缺陷。
    MgResourceIdentifier destResource, bool overwrite); 
    如下的代码示意了移动资源文档Library://Geography/World.MapDefinition到Library://Atlas/Oceans.MapDefinition。
    $oldPath = new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    $newPath = new MgResourceIdentifier("Library://Atlas/Oceans.MapDefinition");
    $resourceService->MoveResource($oldPath, $newPath, true);
    如下的代码示意了移动资源文件夹Library://Geography/到Library://World Geography/。
    $oldPath = new MgResourceIdentifier("Library://Geography/");
    $newPath = new MgResourceIdentifier("Library://World Geography/");
    $resourceService->MoveResource($oldPath, $newPath, true);
    资源服务没有提供一个方法来重命名资源,因为MoveResource(…)就可以实现此功能。如下的代码示意了重命名资源Oceans.MapDefinition为Pacific Ocean.MapDefinition。
    $oldPath = new MgResourceIdentifier("Library://Atlas/Oceans.MapDefinition");
    $newPath = new MgResourceIdentifier("Library://Atlas/Pacific Ocean.MapDefinition");
    $resourceService->MoveResource($oldPath, $newPath, true);
3.4.8 拷贝资源
    方法RenameResourceData(…)用于拷贝指定的资源到其它位置。参数sourceResource用于指定一个需要拷贝的资源,它既可以是一个文档,也可以是一个文件夹。如果指定一个资源文件夹,此方法亦拷贝文件夹下的资源。参数destResource用于指定拷贝的目标位置。newDataName用于指定新的资源数据名称。参数overwrite用于决定在目标资源存在的情况下是否覆盖它。如果拷贝的是文件夹、 overwrite为真,且目标文件夹已经存在,那么只覆盖目标文件夹下具有相同文件夹名称的子文件夹,其它的文件夹保持原样。
    void CopyResource(MgResourceIdentifier sourceResource,
    MgResourceIdentifier destResource, bool overwrite);
    如下的代码示意了拷贝资源文档Library://Geography/World.MapDefinition到Library://Atlas/World Geography.MapDefinition。
    $source_resourceID= new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    $destination_resourceID= new MgResourceIdentifier("Library://Atlas/World Geography.MapDefinition");
    $resourceService->CopyResource($source_resourceID, $destination_resourceID, true);
    如下的代码示意了拷资源文件夹Library://Geography/到Library://World/Oceans/。
    $source_resourceID= new MgResourceIdentifier("Library://Geography/");
    $destination_resourceID= new MgResourceIdentifier("Library://World/Oceans/");
    $resourceService->CopyResource($source_resourceID, $destination_resourceID, true);
3.4.9 设置资源权限
    通过方法SetResource(…)更新资源的头,可以改变资源的权限设置。但是,这种方式不是非常直观。所以,资源服务还提供了另外两个更为方便的方法。在使用如下两个方法时,必须以Administrator登录,或者登录用户是指定资源的主人(Owner)。通过调用EnumerateResources(…)可以获得资源的主人。
    void InheritPermissionsFrom(MgResourceIdentifier resource);
    void ChangeResourceOwner(MgResourceIdentifier resource, string owner, bool includeDescendants);
    方法InheritPermissionsFrom(…)用于设置指定资源文件夹的所有子孙继承此文件夹的权限设置。此方法只能使用于Library资源库,不可以用于Session资源库。参数resource必须指定一个文件夹资源。
    例如:文件夹Library://Geography/下包含一个地图定义资源和一个包含了两个要素源资源的文件夹,通过调用此方法会将此文件夹下的所有资源设置为“inherit”。
    $resourceID= new MgResourceIdentifier("Library://Geography/");
    $resourceService->InheritPermissionsFrom($resourceID);
    方法ChangeResourceOwner(…)用于改变指定资源的主人。参数source用于指定一个需要改变主人的资源,它既可以是一个文档,也可以是一个文件夹。参数owner用于指定新主人的用户ID。参数includeDescendants用于决定是否改变资源子孙的主人。只有在指定的资源是文件夹时,此参数才有意义。
如下的代码示意了如何改变一个资源的主人。
    $resourceID= new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    $resourceService->ChangeResourceOwner($resourceID, "John Smith", false);
3.5 管理资源数据
    资源数据隶属于一个资源,资源使用不同的名称来区分不同的资源数据。所以,每个资源数据都有一个唯一的名称。
资源服务提供了API用于枚举、获取、添加、删除和重命名资源数据。

3.5.1 枚举资源数据
    方法EnumerateResourceData(…)用于枚举指定资源的数据。参数resource用于指定一个需要枚举数据的资源。返回值是一个使用ReourceDataList XML Schema的XML字节流,它描述了所有枚举得到的资源数据。
    MgByteReader EnumerateResourceData(MgResourceIdentifier resource);
    如下的代码示意了如何枚举资源的数据。
    $resourceID = new MgResourceIdentifier("Library://Geography/Calgary.FeatureSource");
    $byteReader = $resourceService->EnumerateResourceData($resourceID);
    echo $byteReader->ToString();
    执行上面的代码,会得到类似如下的XML。
    <?xml version="1.0" encoding="UTF-8"?>
    <ResourceDataList xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance

       xsi:noNamespaceSchemaLocation="ResourceDataList-1.0.0.xsd">
         <ResourceData>
             <Name>locations of points</Name>
             <Type>File</Type>
         </ResourceData>
    </ResourceDataList>
3.5.2 获取资源数据
    方法GetResourceData(…)用于枚举指定资源的数据。参数resource用于指定一个需要枚举数据的资源。dataName用于指定需要返回的资源数据的名称,这个名称是调用setResourceData(…)时所设置的名称。返回值是一个包含资源数据内容的字节流。
    MgByteReader GetResourceData(MgResourceIdentifier resource, String dataName);
    如下的代码示意了如何获取资源的数据。
    $resourceID = new MgResourceIdentifier("Library://Geography/Calgary.FeatureSource");
    $byteReader = $resourceService->GetResourceData($resourceID, "locations of points");
    $byteSink = new MgByteSink($byteReader);
    $byteSink->ToFile('C:temppoints.sdf');
3.5.3 设置资源数据
    方法SetResourceData(…)用于为指定资源的添加数据,它会将数据上传和存储到资源库。但是,它并不会进行任何数据转换的操作。参数resource用于指定一个需要设置数据的资源。参数dataName用于指定资源数据的名称,它可以是任何合法的UTF-8字符串。如果资源已经具有相同名称的数据,那么会覆盖掉资源库中已有的数据。如果资源数据名称为MgResourceDataName::UserCredentials,那么可以在资源的内容中插入标签MgResourceTag::Username和MgResourceTag::Password,这两个标签分别代表FDO Providers的用户名和密码,资源服务会使用资源数据中提供的认证信息替换它们。参数dataType用于指定资源数据的类型,它必须是类MgResourceDataType中预定义的某一类型。参数data用于指定数据。
    void SetResourceData(MgResourceIdentifier resource, string dataName, string dataType, MgByteReader data);
    如下的代码示意了如何设置资源数据,将其存储为文件。
    $resourceID = new MgResourceIdentifier('Library://Geography/Calgary.FeatureSource');
    $byteSource = new MgByteSource('C:DataCalgaryDataCalgary points.sdf');
    $data = $byteSource->GetReader();
    $resourceService->SetResourceData($resourceID, 'locations of points', 'File', $data);
    如下的代码示意了如何设置资源数据,将其存储为流。
    $resourceID = new MgResourceIdentifier('Library://Geography/Trees.SymbolLibrary');
    $byteSource = new MgByteSource('C:DataCalgaryDatamarkers.dwf');
    $data = $byteSource->GetReader();
    $resourceService->SetResourceData($resourceID, 'symbols for points', 'Stream', $data);
    如下的代码示意了如何为资源设置内嵌的认证信息,将其存储为字符串。当设置资源的内嵌的认证信息时,必须设置资源数据的名称为MgResourceDataName::UserCredentials,类型为字符串。
    $resourceID = new MgResourceIdentifier('Library://Geography/database connnection.FeatureSource');
    $byteSource = new MgByteSource('C:DataCalgaryDatacredentials.txt');
    $data = $byteSource->GetReader();
    $dataName = new MgResourceDataName();
    $resourceService->SetResourceData($resourceID, MgResourceDataName::UserCredentials, 'String', $data);
3.5.4 重命名资源数据
    方法RenameResourceData(…)用于重命名指定的资源数据。参数resource用于指定一个需要重命名数据的资源。oldDataName用于指定需要重命名的资源数据的名称。newDataName用于指定新的资源数据名称。Overwrite用于决定在目标资源数据存在的情况下是否覆盖它。
    void RenameResourceData(MgResourceIdentifier resource, String oldDataName,  String newDataName, bool overwrite); 
    如下的代码示意了如何重命名资源数据。
    $resourceID = new MgResourceIdentifier("Library://Geography/Calgary.FeatureSource");
    $resourceService->RenameResourceData($resourceID, "locations of points", "locations of historical sites", true);
3.5.5 删除资源数据
    方法DeleteResourceData(…)用于删除指定的资源数据。参数resource用于指定一个需要删除数据的资源。dataName用于指定需要删除的资源数据的名称。
    void DeleteResourceData(MgResourceIdentifier resource, String dataName);
    如下的代码示意了如何重命名资源数据。
    $resourceID = new MgResourceIdentifier("Library://Geography/Calgary.FeatureSource");
    $resourceService->DeleteResourceData($resourceID, "locations of points");
3.6 管理资源包
    资源服务只提供了应用资源包的API,没有提供创建资源包的API。但是,MapGuide Studio提供了用户界面创建资源包,而且也提供了API来创建资源包。所以,如果需要可以使用MapGuide Studio来创建资源包。
    方法ApplyResourcePackage(…)用于应用资源包到Library资源库,它不支持Session资源库。此方法是一个原子操作,如果在应用资源包中的某一资源的时候执行失败,那么会回滚此前的所有修改。
    ApplyResourcePackage(MgByteReader resourcePackage); 

从零开始配置Kubernetes MutatingWebhook:避免‘requested resource not found’的完整教程 本文详细介绍了如何从零开始配置Kubernetes MutatingWebhook,并解决常见的‘requested resource not found’报错问题。通过环境准备、Webhook服务开发、部署配置和问题排查等步骤,帮助开发者顺利完成MutatingWebhook的配置,特别针对路径匹配、TLS证书和资源类型等易错点进行了重点解析。 阅读详情

相关推荐

ros云服务器_减少运维工作量,如何通过 ROS 轻松实现资源编排新方式

简介:以“基础设施即代码”的理念代替“重复劳动”。在日常工作中,我们一定遇到过需要快速构建系统的工作情形:作为资源管理人员,需要接收一定数量以及配置的资源申请,这些申请要求网络、存储设备按需到位; 作为开发人员,需要将一套开发环境,复制一份测试环境以及线上环境; 架构师规划一套系统,需要在云上进行搭建。 这些场景都展现着我们日常所遇的各种困难:对各类云端资源需要进行广泛支持与管理:这其中需要包括常...

weixin_30737431的博客 221

Spring Authorization Server入门 (九) Spring Boot引入Resource Server对接认证服务

书接上文,本次来对接一下资源服务,在本篇文章中会带领大家去构建一个资源服务器,通过注解校验token中的权限,怎么放行一个接口,使其不需要认证也可访问。

云逸的博客 3765

17-什么是资源服务器

Resource Server又称作资源服务器,它是OAuth2中的一个重要概念。这个概念并不容易理解。 什么是资源服务器 以下摘自RFC文档对资源服务器的描述: The server hosting the protected resources, capable of accepting and responding to protected resource requests using access tokens. 托管受保护的资源,并且有使用Access Token来接受和响应对受保护资源的访

码农小胖哥 3808

springsecurity03-springsecurity oauth2实现单点登录之-资源服务器(Resource Service)

文章目录资源文件简介资源文件实战 资源文件简介 文章参考自 https://projects.spring.io/spring-security-oauth/docs/oauth2.html 一个资源服务(可以和授权服务在同一个应用中,当然也可以分离开成为两个不同的应用程序)提供一些受token令牌保护的资源,Spring OAuth提供者是通过Spring Security authentica...

liaomin416100569的专栏 1806

在 SAP BTP Cloud Foundry 中读懂 mta.yaml 里的 XSUAA 资源与 service key 配置

摘要:这段MTA配置定义了一个XSUAA授权服务实例,用于SAP BTP Cloud Foundry环境。它包含服务名称、类型和参数配置,其中xs-security.json文件定义了应用安全模型。该配置会在部署时自动创建服务实例并生成访问密钥,为UI5应用提供身份验证和授权功能。通过resources块声明依赖服务,modules块中的应用模块可以引用这些服务。这种模式常见于SAP CAP和HTML5项目,实现应用与平台服务的自动化集成。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 136

Spring Cloud OAuth2 教程

https://www.jianshu.com/p/3427549a148a 二、Spring Cloud OAuth2 token存数据库实现 三、Spring Cloud Oauth2 JWT 实现 学习一下Spring Cloud OAuth2,我们分三个项目 eureka-server、service-auth、service-hi g9.png 1. 创建eureka-s...

672

@Service 和 @Resource 注解

1 前言在咱们使用 spring 框架的时候,注解是“不可或缺”的一部分,她帮我们脱离了配置繁琐的 XML 文件的工作,但有一点却需要我们自己去把握,那就是“3何”,即“何时何地用何注解?”在本篇博文中,作者就简单介绍一下如何恰当的使用 @Service 和 @Resource 这两个注解。2 注解2.1 @Service当咱们需要定义某个类为一个 bean 的时候,就可以在这个类的类名上一行加一个

lmt_0716的博客 863

Linux 隐藏进程

这种方式属于DKoM(Direct Kernel Object Manipulation)攻击方式了,即直接内核对象操作技术。关于第一种hook方式可以参考上一篇文章。最后推荐一个rootkit工具。

chi's blog 2051

LSPatch 注入原理全解:Revenge Manager 如何把 Xposed 模块塞进 Discord

Revenge Manager 是一款面向 Android 的工具应用,它利用 LSPatch 注入原理,无需 Root 就能把 Revenge 这个 Xposed 模块打进 Discord,生成一个可独立运行的改版客户端。本文将带你完整理解它「下载 → 修改 → 安装」的全流程管线、LSPatch 模块注入的关键步骤,以及每一环对应的源码文件。 ## 什么是 LSPatch 注入?无需 Roo

gitblog_00510的博客 213

RK3566开发板实战:YT8512C百兆网卡调试全记录(附DTS配置避坑指南)

本文详细记录了RK3566开发板上YT8512C百兆以太网卡的调试全过程,包括硬件信号检测、DTS配置优化及常见错误排查。特别针对DTS配置中的关键参数和避坑指南进行了深入解析,为开发者提供实用的调试技巧和经验分享。

weixin_29189381的博客 272

STM32裸机开发基础:寄存器直接操作详解

寄存器是微控制器内部的特殊存储单元,直接与硬件电路连接,用于控制和监视硬件功能。与普通内存不同,寄存器的每一位(bit)通常都有特定的硬件含义。寄存器就是机器的控制面板上的各种开关和指示灯每个开关控制一个具体功能(如打开LED、启动通信)每个指示灯显示一个具体状态(如数据接收完成、错误发生)// GPIO引脚定义1。

2401_88760782的博客 2187

Restbed核心组件完全指南:Service、Resource、Session详解

Restbed是一个强大的C++异步RESTful框架,它通过Service、Resource和Session三大核心组件为开发者提供了构建高效Web服务的完整解决方案。本文将深入解析这三个核心组件的功能特性、使用方法和最佳实践,帮助新手快速掌握Restbed框架的精髓。 ## 一、Service:REST服务的总控中心 🚀 Service组件是Restbed应用的核心引擎,负责协调整个服务

gitblog_00633的博客 928

保姆级教程:用BIGEMAP和Global Mapper搞定5米精度DEM高程数据下载与处理

本文提供了一份详细的5米精度DEM高程数据处理教程,涵盖从BIGEMAP下载到Global Mapper处理的完整流程。通过实战案例和避坑指南,帮助用户掌握高效下载DEM数据、优化等高线生成及坐标系转换的关键技巧,适用于GIS新手和专业人士。

weixin_34169322的博客 390

astron-rpa 资源管理服务(Resource Service)深度解析:基于 Spring Boot 3 + MinIO/S3 的文件上传下载实战指南

本文以 astron-rpa 开源仓库中的 [backend/resource-service](https://link.gitcode.com/i/75f0dc292822a4a53df217436563d379) 模块(官方文档为 [backend/resource-service/README.zh.md](https://link.gitcode.com/i/3b89e9fbf1bd80

gitblog_00319的博客 125

Python电商网站全站爬虫实战:以京东为例的数据采集与分析

随着电子商务的蓬勃发展,电商数据已成为市场研究、竞争分析和消费者行为研究的重要资源。本文详细介绍了如何使用Python最新技术栈构建一个高效的电商网站全站爬虫,以京东为例实现商品数据的自动化采集。文章涵盖了爬虫的法律与伦理考量、技术选型、反爬虫策略应对、分布式架构设计以及数据存储方案,并提供了完整的代码实现。本爬虫系统采用Scrapy-Redis分布式框架、Selenium动态渲染、智能代理轮换和机器学习验证码识别等先进技术,能够稳定高效地抓取京东全站商品数据,为电子商务研究提供数据支持。关键词。

2201_76125261的博客 414

【python股票价格预测】基于CNN-LSTM的股票价格预测(附python代码)

【python股票价格预测】基于CNN-LSTM的股票价格预测(附python代码)

k8291121的博客 2008

vue_resource

引入vue-resource: 基本语法   引入vue-resource后,可以基于全局的Vue对象使用http,也可以基于某个Vue实例使用http。 // 基于全局Vue对象使用: httpVue.http.get('/someUrl', [options]).then(successCallback, errorCallback); Vue.http.post('/someU

韩吉鑫的博客 435

2、欧洲期权的赫斯顿模型

本文详细介绍了赫斯顿随机波动率模型在欧洲期权定价中的应用。模型通过引入随机方差过程,克服了布莱克-斯科尔斯模型中波动率恒定的局限性,更贴近市场实际。文章阐述了模型的动态结构、风险中性转换、期权定价公式及其半封闭解的计算方法,并提供了基于VBA的数值实现方案。通过梯形法则与高斯积分等数值方法对比,分析了不同积分策略的精度与效率。同时验证了当波动率为零时,赫斯顿模型退化为布莱克-斯科尔斯模型的一致性。最后讨论了模型的优势、挑战及实际应用建议,强调了数值积分稳定性和参数估计的重要性。

tequila的博客 349

Autodesk Genuine Service彻底卸载指南:绕过系统保护的四步精准清除法

Windows服务是操作系统核心管理机制,通过svchost.exe托管、注册表深度绑定、PE资源节标识及Stub进程守护实现持久化运行。这类服务具备高权限、强依赖和防篡改特性,常规卸载仅清理安装目录,无法触达其底层‘存在证明’。Autodesk Genuine Service正是典型代表,它利用Windows服务保护(WRP)、DelayedAutoStart启动策略、许可服务联动等机制形成三重防御,导致用户无法停止、禁用或删除。本文聚焦于服务本质原理,提供不依赖第三方工具、不破坏软件功能的工程化清除路径

weixin_30702441的博客 469

32、高光谱遥感技术在军事领域的应用解析

高光谱遥感技术凭借其高分辨率和精细光谱分析能力,在军事领域广泛应用于战场详细侦察、伪装目标识别及目标实际温度与发射率的检测,显著提升了目标识别精度和作战支持能力。同时,该技术在内陆水体成分反演、海洋环境监测和农业管理等领域也展现出巨大潜力。尽管面临数据量大、处理复杂、技术融合不足和仪器性能限制等挑战,未来通过人工智能融合、高效算法研发和先进仪器开发,高光谱遥感技术将在多领域实现更深入应用与发展。

blue的专栏 229

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

resource 和 K8S 对接部分 apifox

问题解决摘要 系统分析发现资源服务的Kubernetes连接问题源于证书验证失败。通过以下步骤解决: 定位日志文件:/home/user/resource/resource-service/target/log/resource-service.log 确认问题:PKIX证书路径验证失败 解决方案: 修改配置文件添加kubeconfig路径 停止原进程(PID:1947567) 重启服务(PID:1080798) 验证结果:服务正常启动,证书错误消失,成功获取K8S节点信息。

victory0431的博客 914

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

cannot be resolved to absolute file path springboot获取resource文件失败

```springboot 打成jar包获取 resource文件失败 代码解决 InputStream fileInputStream = TreeListServiceImpl.class.getClassLoader().getResourceAsStream(“temp/service.json”);//获取文件路径 StringBuilder buffer = new StringBuilder(); byte[] bytes = new byte[1024]; try { for (int n;

qq_36395686的博客 1205

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

阿里云资源编排ROS使用教程

阿里云资源编排ROS详细内容: 阿里云资源编排ROS使用教程 资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure ...

weixin_40050195的博客 394

一分钟了解阿里云产品:资源编排概述

阿里云发布了很多产品,今天让我们一起来了解下资源编排(Resource Orchestration)吧。 什么是资源编排呢? 一句话,资源编排提供了通过模板(类JSON)创建一组集群,如典型的SLB+ECS的云服务组合,会自动将云服务之间的依赖配置完成, 并且提供了向导快速生成常用的模板。 相比传统手工创建云资源的方式,资源编排有哪些优势呢...

weixin_33890526的博客 646
上一篇: 资源
下一篇: 空间参考系统
MapGuide_Inside
博客等级 码龄17年 340粉丝 71原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值