Как прочитать переменное количество путей @RequestMapping из свойств - PullRequest
0 голосов
/ 12 марта 2019

В Spring (загрузка) я могу экспортировать значения аннотаций в свойства приложения / среды, используя синтаксис ${...}:

@RequestMapping("${some.path.property}")

Я также могу привязать контроллер к нескольким путям:

@RequestMapping("/one", "/two")

Как мне объединить два? Я хотел бы определить список путей в моих свойствах, как разделенный запятыми /one, /two или (предпочтительно) как список в моем application.yaml:

some.path.property:
    - /one
    - /two

Но как я могу интерполировать любой вид списка в аннотации?

@RequestMapping(???)

Редактировать: я не мог понять, как читать весь список из YAML (может быть, потому что он превратился в отдельные свойства some.path.property[0], some.path.property[1] ... во время разбора YAML?)

Для более простого случая одного свойства CSV, скажем:

some.csv.property: /one, /two

Я могу использовать замену свойства: "${some.csv.property}" или явное разделение SpEL: "#{'${some.csv.property}'.split('[, ]+')}", чтобы преобразовать его в массив, но в обоих случаях это работает только для аннотаций @Value. Если я попробую на @RequestMapping, у меня всегда будет один путь.


Edit2: я могу сделать это, где -- - это просто случайная строка, которая не является допустимым путем, но это очень уродливо:

@RequestMapping(
    "${some.path.property[0]:--}",
    "${some.path.property[1]:--}",
    "${some.path.property[2]:--}",
    "${some.path.property[3]:--}",
    "${some.path.property[4]:--}",
    "${some.path.property[5]:--}",
    "${some.path.property[6]:--}",
    "${some.path.property[7]:--}",
    "${some.path.property[8]:--}",
    "${some.path.property[9]:--}"
)

Ответы [ 3 ]

1 голос
/ 12 марта 2019

Если у вас есть файл свойств yaml (не повторяйте сам принцип :)), вы можете сделать это так:

some:
  path:
    property:
      one: /path1
      two: /path2

Если вы используете @GetMapping (или @RequestMapping), вы можете сделать это следующим образом в вашем контроллере:

@GetMapping(value={"${some.path.property.one}", "${some.path.property.two}"})

А вот и лог

 Mapped "{[/path1 || /path2],methods=[GET]}" onto public java.util.List<com.zero.SimpleController> com.zero.SimpleController.hello()
1 голос
/ 12 марта 2019

Вы пробовали это?:

some:
  path:
    property: /one, /two

А потом

@RequestMapping("${some.path.property}") 

На основании этого ответа https://stackoverflow.com/a/41462567/7425783 должно работать нормально

0 голосов
/ 13 марта 2019

Вы можете попробовать создать HandlerMapping, чтобы добавить URL, вот только пример для использования SimpleUrlHandlerMapping

@RestController
public class WelcomeController {

    public String ping() {
        return "pong";
    }
}

@SpringBootApplication
@Slf4j
@RestController
public class StackOverflowApplication {

    @Autowired
    WelcomeController welcomeController;

    @Value("${paths}")
    List<String> paths;


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



    @Bean
    public SimpleUrlHandlerMapping simpleUrlHandlerMapping() {
        SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping();
        Map<String, Object> map = new HashMap<>();
        final Method getUser = ReflectionUtils.findMethod(WelcomeController.class, "ping");
        final HandlerMethod handlerMethod = new HandlerMethod(welcomeController, getUser);
        for (String path : paths) {
            map.put(path, handlerMethod);
        }
        simpleUrlHandlerMapping.setUrlMap(map);
        simpleUrlHandlerMapping.setOrder(Ordered.HIGHEST_PRECEDENCE);

        return simpleUrlHandlerMapping;
    }


}

файл yml

paths: ping, ping1, ping2, ping3

Вот код в github

...