Инициализация объекта с помощью пользовательского файла YAML в Spring Boot [дубликат]

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

read_single_keypress() любезность https://stackoverflow.com/a/6599441/4532996

def read_single_keypress() -> str:
    """Waits for a single keypress on stdin.
    -- from :: https://stackoverflow.com/a/6599441/4532996
    """

    import termios, fcntl, sys, os
    fd = sys.stdin.fileno()
    # save old state
    flags_save = fcntl.fcntl(fd, fcntl.F_GETFL)
    attrs_save = termios.tcgetattr(fd)
    # make raw - the way to do this comes from the termios(3) man page.
    attrs = list(attrs_save) # copy the stored version to update
    # iflag
    attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK
                  | termios.ISTRIP | termios.INLCR | termios. IGNCR
                  | termios.ICRNL | termios.IXON )
    # oflag
    attrs[1] &= ~termios.OPOST
    # cflag
    attrs[2] &= ~(termios.CSIZE | termios. PARENB)
    attrs[2] |= termios.CS8
    # lflag
    attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON
                  | termios.ISIG | termios.IEXTEN)
    termios.tcsetattr(fd, termios.TCSANOW, attrs)
    # turn off non-blocking
    fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK)
    # read a single keystroke
    try:
        ret = sys.stdin.read(1) # returns a single character
    except KeyboardInterrupt:
        ret = 0
    finally:
        # restore old state
        termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
    return ret

def until_not_multi(chars) -> str:
    """read stdin until !(chars)"""
    import sys
    chars = list(chars)
    y = ""
    sys.stdout.flush()
    while True:
        i = read_single_keypress()
        _ = sys.stdout.write(i)
        sys.stdout.flush()
        if i not in chars:
            break
        y += i
    return y

def _can_you_vote() -> str:
    """a practical example:
    test if a user can vote based purely on keypresses"""
    print("can you vote? age : ", end="")
    x = int("0" + until_not_multi("0123456789"))
    if not x:
        print("\nsorry, age can only consist of digits.")
        return
    print("your age is", x, "\nYou can vote!" if x >= 18 else "Sorry! you can't vote")

_can_you_vote()

Здесь вы можете найти полный модуль здесь .

Пример:

$ ./input_constrain.py
can you vote? age : a
sorry, age can only consist of digits.
$ ./input_constrain.py 
can you vote? age : 23
your age is 23
You can vote!
$ _

Обратите внимание, что природа этой реализации заключается в том, что она закрывает stdin, как только считывается что-то, что не является цифрой. Я не попал в enter после a, но мне нужно было после чисел.

Вы можете объединить это с функцией thismany() в том же модуле, чтобы разрешить, скажем, три цифры.

13
задан Johan Frick 17 April 2014 в 14:45
поделиться

4 ответа

@PropertySource не поддерживает YAML (вероятно, это будет весной 4.1). Вы можете установить spring.config.location или spring.config.name в список, разделенный запятыми (например, как системное свойство или аргумент командной строки).

Лично мне нравится все мое ЯМЛ в одном и том же месте (структура действительно помогает разбить его визуально, и вы можете использовать документы внутри файла, чтобы разделить его больше). Это просто вкус, я думаю.

8
ответ дан Dave Syer 20 August 2018 в 17:44
поделиться
  • 1
    Спасибо, сейчас я буду хранить его в одном файле. Было бы лучше разделить его, но я буду ждать Spring 4.1. – Johan Frick 22 April 2014 в 20:59
  • 2
    Для тестирования интеграции, если вы хотите иметь файл application.yml в тесте / ресурсах и если вы хотите переопределить только несколько атрибутов, отличных от / java / resources, как вы можете это сделать – plzdontkillme 11 December 2014 в 17:58
  • 3
    Используйте @ActiveProfiles и установите только переопределения в профиле, который вы используете для тестирования. Или используйте @IntegrationTest. Или ReflectionTestUtils. – Dave Syer 12 December 2014 в 08:27
  • 4
    Приятно размещать все в одном и том же месте, пока оно не станет слишком большим для поддержания, и в этом случае идеальное решение проблемы, как спрашивает вопросник. – Hazok 5 April 2016 в 19:27

Вы можете использовать активную концепцию профиля в своем основном файле yaml. Например:

spring.profiles.active: test

, что означает, что у вас должен быть файл application-test.yml в вашем каталоге ресурсов. Учтите, что активные профили переопределяют свойства с одинаковыми именами в вашем основном файле yaml.

Для получения дополнительной информации посетите: http://docs.spring.io/spring-boot/docs/current/ ссылка / HTML / загрузочная-функция-profiles.html

6
ответ дан Jalal Sajadi 20 August 2018 в 17:44
поделиться

, если у меня много конфигураций и / или сред, обычно я делаю так:

$ cat src/main/resources/application.yml:
spring:
  profiles:
    include: >
      profile1,
      profile2,
      ...
      profileN

$ ls -lah src/main/resources/config:
drwxr-xr-x  4 mak  staff   136B Apr 16 23:58 .
drwxr-xr-x  6 mak  staff   204B Apr 17 01:54 ..
-rw-r--r--  1 mak  staff    60B Apr 16 23:58 application-profile1.yml
-rw-r--r--  1 mak  staff    62B Apr 16 23:16 application-profile2.yml
...
-rw-r--r--  1 mak  staff    50B Apr 16 23:16 application-profileN.yml
15
ответ дан Maksim Kostromin 20 August 2018 в 17:44
поделиться
18
ответ дан Maksim Kostromin 31 October 2018 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: