Java: Spring: правильный способ внедрения объекта в метод контроллера, реализованный в абстрактном классе - PullRequest
0 голосов
/ 15 января 2020

У меня есть абстрактный класс и метод:

public class MyAbstractController<T> {
    // ...
    ResponseEntity<T> doSomething(
        JobTask
            jobTask
    ) {
        jobTask.run()
        return new ResponseEntity<>(null, HttpStatus.ACCEPTED);
    }
    // ...
}

И у меня есть контроллер, расширяющий этот класс:

public class MyConecreteController extends MyAbstractClass<Xyzzy> {
    // ...
    @GetMapping("/foo")
    public ResponseEntity<Void> doFoo() {
        return doSomething(
            () -> new Foo().bar().baz()
        );
    }
    // ...

Пока все хорошо, все работает отлично. Но мне также нужен вспомогательный объект (например, UriComponentsBuilder, это также может быть любой другой класс, который Spring внедряет в метод контроллера) в MyAbstractClass.doSomething(). Как внедрить его в метод моего абстрактного класса? Как я вижу, самый очевидный способ - сделать что-то подобное:

public class MyAbstractController {
    // ...
    ResponseEntity<Void> doSomething(
        JobTask
            jobTask,
        UriComponentsBuilder
            uriComponentsBuilder
    ) {
        UriComponent uriComponents
            = uriComponentBuilder
                .path("/foo/{bar}")
                    .buildAndExpand(666);
        HttpHeaders httpHeaders
            = new HttpHeaders();
        httpHeaders
            .add(HttpHeaders.LOCATION, uriComponents.toUriString());
        jobTask.run()
        return new ResponseEntity<>(httpHeaders, HttpStatus.ACCEPTED);
    }
    // ...
}

И предоставить MyAbstractController экземпляр UriComponentsBuilder:

public class MyConecreteController {
    // ...
    @GetMapping("/foo")
    public ResponseEntity<Void> doFoo(
        UriComponentsBuilder
            UriComponentsBuilder
    ) {
        return doSomething(
            () -> new Foo().bar().baz(),
            uriComponentsBuilder
        );
    }
    // ...
}

Это работает, но мне это НЕ нравится, так как я хотел бы избежать добавления дополнительного параметра (UriComponentsBuilder) к сигнатуре MyAbstractClass.doSomething(). Есть ли способ ввести его как-нибудь еще?

Спасибо!

...