Есть ли способ сопоставления значений в список объектов из YAML - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь создать список объектов серверов из файла YAML, как я видел в этом сообщении , но с Micronaut.

Мой файл YAML имеет следующую конфигурацию:

server:
    -
        name: "Server 1"
        flow: "both"
        environment: "test"
    -
        name: "Server 2"
        flow: "both"
        environment: "production"

Мой POJO:

package dev.renansouza.server;

public class Server {

    private String name;
    private String flow;
    private String environment;

    public Server() {}

    public Server(String name, String flow, String environment) {
        this.name = name;
        this.flow = flow;
        this.environment = environment;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getFlow() {
        return flow;
    }

    public void setFlow(String flow) {
        this.flow = flow;
    }

    public String getEnvironment() {
        return environment;
    }

    public void setEnvironment(String environment) {
        this.environment = environment;
    }

    @Override
    public String toString() {
        return "Servers -> name: " + name + " flow: " + flow + " environment: " + environment;
    }

}

И мой сервис:

package dev.renansouza.server;

import io.micronaut.context.annotation.ConfigurationProperties;

import javax.annotation.PostConstruct;
import javax.inject.Singleton;

import java.util.ArrayList;
import java.util.List;

import static dev.renansouza.server.ServerService.PREFIX;

@Singleton
@ConfigurationProperties(PREFIX)
public class ServerService {

    public static final String PREFIX = "server";

    private List<Server> networkRules = new ArrayList<>();

    @PostConstruct
    public void init() {
        for(Server s : this.getServers()) {
            System.out.println(s);
        }
    }

    public List<Server> getServers() {
        return this.networkRules;
    }
}

Я поставил точку останова в строке System.out.println и запустил приложение как отладочную, но ничего не происходит.

Нужно ли выполнять какие-либо дополнительные настройки?

1 Ответ

2 голосов
/ 05 апреля 2019

См. Проект на https://github.com/jeffbrown/renansouzaproperties.

https://github.com/jeffbrown/renansouzaproperties/blob/master/src/main/resources/application.yml

micronaut:
    application:
        name: renansouzaproperties
server:
    Server 1:
        flow: both
        environment: test
    Server 2:
        flow: both
        environment: production

https://github.com/jeffbrown/renansouzaproperties/blob/master/src/main/java/renansouzaproperties/Server.java

package renansouzaproperties;

import io.micronaut.context.annotation.EachProperty;
import io.micronaut.context.annotation.Parameter;

@EachProperty("server")
public class Server {
    private String name;
    private String flow;
    private String environment;

    public Server(@Parameter String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getFlow() {
        return flow;
    }

    public void setFlow(String flow) {
        this.flow = flow;
    }

    public String getEnvironment() {
        return environment;
    }

    public void setEnvironment(String environment) {
        this.environment = environment;
    }

    @Override
    public String toString() {
        return "Servers -> name: " + name + " flow: " + flow + " environment: " + environment;
    }
}

https://github.com/jeffbrown/renansouzaproperties/blob/master/src/main/java/renansouzaproperties/DemoController.java

package renansouzaproperties;

import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.HttpStatus;

import java.util.List;

@Controller("/demo")
public class DemoController {

    private List<Server> serverList;

    public DemoController(List<Server> serverList) {
        this.serverList = serverList;
    }

    @Get("/")
    public HttpStatus index() {
        for(Server server: serverList) {
            System.out.println(server);
        }
        return HttpStatus.OK;
    }
}

Если вы запустите приложение и отправите запрос на http://localhost:8080/demo, вы увидите вывод, похожий на этот, который указывает на то, что были созданы нужные экземпляры Server:

Servers -> name: server 1 flow: both environment: test
Servers -> name: server 2 flow: both environment: production

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

Надеюсь, это поможет.

...