Передача аргументов из свойств приложения REST API в зарегистрированный ApplicationEventListener
В одном из моих случаев использования я хочу передать несколько параметров из свойств ресурса приложения Spring boot Rest API, и эти параметры должны прослушиваться зарегистрированным ApplicationEventListener или ApplicationEvent в Джерси. Может ли какой-нибудь орган, пожалуйста, подскажите мне, как мне этого добиться. Ниже моя база кода
package com.learning;
import org.springframework.boot.context.ApplicationPidFileWriter;
import org.springframework.context.ConfigurableApplicationContext;
public class ABCApplication {
public static void main(String args[])
{
ConfigurableApplicationContext context =
SpringApplication.run(ABCApplication.class, args);
context.addApplicationListener(new ApplicationPidFileWriter());
context.addApplicationListener(new TestingListener());
}
}
Вот мой Слушатель, который должен быть запущен и получить эти параметры из Rest API.
import org.glassfish.jersey.server.monitoring.ApplicationEvent;
import org.glassfish.jersey.server.monitoring.ApplicationEventListener;
public class TestingListener implements ApplicationEventListener {
@Override
public void onEvent(ApplicationEvent event) {
if (event.getType() ==
ApplicationEvent.Type.INITIALIZATION_APP_FINISHED) {
final ResourceModel resourceModel = event.getResourceModel();
final ResourceLogDetails logDetails = new
ResourceLogDetails();
resourceModel.getResources().stream().forEach((resource) -> {
logDetails.addEndpointLogLines(getLinesFromResource(resource));
});
logDetails.log();
}
}
Прикрепление моего ресурса
@Api
@Path("/resource")
public static class MyResource {
@GET
@Path("/get/path")
public String getMethod() {
return "get";
}
@POST
public void post(String entity) {
}
}
Таким образом, результат, который я ожидаю,
GET resource/get/path
POST resource
Но это моя бизнес-логика, и я хочу получить здесь еще несколько значений, которые должны исходить из файла свойств ресурсов приложения.
1 ответ
Хорошо, так как для меня не ясно, что и как вам нужно для управления вентиляцией, я приведу вам стандартный пример:
Чтобы опубликовать событие при весенней загрузке, вы можете создать сервис, управляющий публикацией:
@Component
public class CustomSpringEventPublisherService {
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
public void publishCustomEvent(final String message) {
System.out.println("Publishing custom event. ");
CustomSpringEvent customSpringEvent = new CustomSpringEvent(this, message);
applicationEventPublisher.publishEvent(customSpringEvent);
}
}
CustomSpingEvent - это POJO, содержащий вашу полезную нагрузку и источник:
public class CustomSpringEvent extends ApplicationEvent {
private String message;
public CustomSpringEvent(Object source, String message) {
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
}
Затем вы можете реализовать слушателя следующим образом:
@Component
public class AnnotationDrivenContextStartedListener {
@EventListener
public void handleContextStart(CustomSpringEvent event) {
System.out.println("A custom event and his payload ->"+event.getMessage());
}
}
Теперь в вашем случае вы можете реализовать прослушиватель, как показано, а в контроллере вы можете разместить службу издателя: @RestController @RequestMapping ("/") public class YourController {
private final CustomSpringEventPublisherService customSpringEventPublisherService;
public YourController(CustomSpringEventPublisherService customSpringEventPublisherService) {
this.customSpringEventPublisherService = customSpringEventPublisherService;
}
@GetMapping(value = "/resource")
public ResponseEntity<PublicationDto> getResource() {
// Create CustomSpringEvent
CustomSpringEvent customSpringEvent = new CustomSpringEvent(...)
this.customSpringEventPublisherService.publishCustomEvent(customSpringEvent);
}
}
Это действительно концептуальная работа и не проверенная.
Надеюсь, это поможет вам понять, как это работает