Как внедрить PlatformApi в микросервисное приложение?

Мне нужно создать небольшой микросервис, который получает запрос REST и сохраняет данные (устройства, измерения и т. Д.) В Cumulocity.

Для меня не очень понятно из документации, как можно легко внедрить platformApi в мое приложение Spring Boot. Особенно использование Scope (TenantScope & UserScope) неясно.

Можете ли вы привести очень простой пример "hello-world", как автоматически подключить платформу Api (например, инвентаризация) и при запуске приложения сделать что-то (распечатать все устройства) в рамках арендатора и с помощью RestControler RequestMapping сделать что-то в пользовательской области?

Вот фрагмент кода:

package c8y.example;

import com.cumulocity.microservice.autoconfigure.MicroserviceApplication;  
import com.cumulocity.microservice.context.inject.TenantScope;
import com.cumulocity.sdk.client.inventory.InventoryApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;

@MicroserviceApplication
@RestController
public class App{

@Autowired
InventoryApi inventoryApi;

public static void main(String[] args) {
    SpringApplication.run(App.class, args);
}

@PostConstruct
public void init() {
    System.out.println("Devices: " + inventoryApi.getManagedObjects());
}

@RequestMapping("devices")
public String greeting() {
    return "Devices: " + inventoryApi.getManagedObjects();
}
}

Все, что я до сих пор пробовал, приводило к ошибке при запуске, что бины не могли быть введены, или что они не находятся в требуемой области или не находятся в контексте. У меня есть application.properties, который содержит учетные данные начальной загрузки.

1 ответ

Решение

Я нашел первое решение, но я все еще не уверен, в чем разница между арендатором и пользовательской областью и когда область используется. Но, может быть, это немного помогает.

Мне не удалось автоматически подключить API инвентаризации, но я смог автоматически подключить API платформы, из которого вы можете использовать API инвентаризации.

package c8y.example;

import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.cumulocity.microservice.autoconfigure.MicroserviceApplication;
import com.cumulocity.model.idtype.GId;
import com.cumulocity.rest.representation.inventory.ManagedObjectRepresentation;
import com.cumulocity.sdk.client.Platform;
import com.cumulocity.sdk.client.inventory.InventoryApi;

@MicroserviceApplication
@RestController
public class App {
    private static final Logger log = org.slf4j.LoggerFactory.getLogger(App.class);

    @Autowired(required = true)
    @Qualifier("userPlatform")
    private Platform platformApi;

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @RequestMapping("/")
    public String greeting() {
        if (platformApi != null && platformApi.getInventoryApi() != null) {
            final InventoryApi inventoryApi = platformApi.getInventoryApi();
            final ManagedObjectRepresentation managedObjectRepresentation = inventoryApi.get(new GId("5749"));

            log.info(managedObjectRepresentation.toString());
            return "device: " + managedObjectRepresentation.getName();
        }

        return "hello world";
    }
}

Первоначально существует доступная область действия, которая представляет собой UserScope, но когда вы посмотрите на класс CumulocityClientFeature, вы увидите, что класс устанавливает PlatformImpl для Tenant Scope в качестве Primary. Это означает, что когда вы автоматически подключаете PlatformApi, он будет автоматически использовать платформу TenantScoped вместо UserScoped. Это не удастся, так как текущий Scope является UserScope. Чтобы автоматически связать правильный PlatformApi, вы должны использовать Qualifier со значением userPlatform, чтобы автоматически связать UserScoped PlatformAPI. Из API платформы вы можете получить доступ к API инвентаризации.

Попытка автоматического подключения API инвентаризации для меня не сработала, так как приложение не может найти API инвентаризации UserScoped. Понятия не имею почему.

Другие вопросы по тегам