У меня есть абстрактный класс и метод:
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()
. Есть ли способ ввести его как-нибудь еще?
Спасибо!