Spring boot: как передать аргумент командной строки в значение аннотации? - PullRequest
0 голосов
/ 03 июня 2019

Вот что я пытаюсь сделать:

@SpringBootApplication public class App {
    public static final String NAME;

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

    @Autowired public App(ApplicationArguments arguments) {
        NAME = arguments.getSourceArgs()[0]; // ERROR (1)
    }

    @GetMapping("/" + NAME) public void test() { // ERROR (2)
        return NAME;
    }
}

Код не работает как написано, потому что (1) NAME не может быть назначен, и (2) значение аннотации для @GetMapping должно быть константным выражением.

Я просто хочу, чтобы @GetMapping использовал значение, основанное на аргументе командной строки. Как это можно сделать?

1 Ответ

0 голосов
/ 03 июня 2019

в первом запросе. весной mvc инициирует ресурс. поэтому вы поместили свой динамический URL в Haddlermapping.

нам нужно три класса. MyController MyDispatcherServlet DispatcherServletCustomConfiguration

MyController.java

@Component(value="MyController")
public class MyController {

@Autowired
ClaimService claimService;

public ResponseEntity<HttpStatus> insertClaim() {
    return new ResponseEntity<>(HttpStatus.OK);
    }

}

MyDispatcherServlet.java. после initStrategies.put ваш динамический URL в handdlerMapping.

public class MyDispatcherServlet extends DispatcherServlet {

private String url;


public MyDispatcherServlet(String url) {
    super();
    this.url = url;
}


@Override
protected void onRefresh(ApplicationContext context) {
    initStrategies(context);
    List<HandlerMapping> handlerMappings = getHandlerMappings();
    for (HandlerMapping handlerMapping : handlerMappings) {

        if (handlerMapping instanceof RequestMappingHandlerMapping) {
            RequestMappingHandlerMapping requestMappingHandlerMapping = ((RequestMappingHandlerMapping) handlerMapping);
            RequestMappingInfo.Builder n = RequestMappingInfo
                    .paths(url)
                    .methods(RequestMethod.GET);
            try {
                Method method = MyController.class.getDeclaredMethod("insertClaim");
                requestMappingHandlerMapping.registerMapping(n.build(), "MyController", method);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }

        }
    }

}


}

DispatcherServletCustomConfiguration.java

@Configuration
public class DispatcherServletCustomConfiguration {

@Value("${myUrl}")
private String url;

@Bean
public DispatcherServlet dispatcherServlet() {
    return new MyDispatcherServlet(url);
   }

}

запустить с помощью команды java -jar stackoverflow-1.0-SNAPSHOT.jar --myUrl=abcd

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...