Внедрение зависимостей Spring в POJO RestController - PullRequest
0 голосов
/ 23 октября 2018

Есть ли способ внедрить зависимости в POJO, предоставляемые Spring RestControllers?Например, если вы хотите реализовать полиморфное поведение.

В следующем примере происходит сбой с NullPointerExcetion, поскольку lowerCaseService не вводится в Example POJO:

@RestController
public class ExampleController {

  @PostMapping("/example")
  String example(@RequestBody Example example) {
    return example.valueToLowerCase();
  }

}

@Data
@NoArgsConstructor
public class Example {

  private String value;

  @Autowired
  private LowerCaseService lowerCaseService;

  public String valueToLowerCase() {
    return lowerCaseService.toLowerCase(getValue());
  }

}

@Service
public class LowerCaseService {
  public String toLowerCase(String value) {
    return value != null ? value.toLowerCase() : null;
  }
}

Примечание.что этот надуманный пример намеренно прост и не нуждается в полиморфном поведении.Я создал его таким образом, чтобы помочь респондентам быстро понять его, а не увязнуть в комментариях Джексона.В моем реальном случае использования Джексон будет производить подклассы Example, где каждому нужно делать совершенно разные вещи с разными зависимостями.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Простой ответ - нет, вы не можете, потому что зависимости внедряются, когда экземпляр компонента создается в контексте Spring, и этот POJO является просто экземпляром, отображенным (вероятно) Джексоном.

Этот ответ имеетнемного больше информации об этом: Как работает автоматическая разводка в Spring?

Но peharps важнее архитектурного принципа, вам действительно не следует помещать бизнес-сервис в вашу внешнюю модель (Пример), поскольку это явное нарушение разделения интересов.

Вы должны внедрить свой сервис в класс контроллера и передать DTO в качестве параметра его методу.

Надеюсь, это полезно!

0 голосов
/ 23 октября 2018

По определению, POJO (обычный старый Java-объект) является обычным классом Java-объектов (то есть не JavaBean, EntityBean и т. Д.) И не выполняет никакой другой специальной роли, а также не реализует никаких специальных интерфейсов каких-либофреймворков Java.Этот термин был придуман Мартином Фаулером, Ребеккой Парсонс и Джошом Маккензи, которые полагали, что, создавая аббревиатуру POJO, такие объекты будут иметь «причудливое имя», тем самым убеждая людей в том, что они достойны использования.Ссылка: https://www.webopedia.com/TERM/P/POJO.html

Другими словами, POJO должен содержать только атрибуты и ничего больше.

Я думаю, что в этом случае мы можем решить проблему, внедрив службу в метод контроллера.

@RestController
public class ExampleController {
  @Autowired
  private LowerCaseService lowerCaseService;

  @PostMapping("/example")
  String example(@RequestBody Example example) {
    return lowerCaseService. toLowerCase(example.getValue);
  }

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