Шаблон проектирования Apt для регистрации каждого запроса в Spring загрузочной Java - PullRequest
0 голосов
/ 12 января 2019

Я создаю Журнал аудита для моего приложения весенней загрузки. Я хочу отслеживать каждый POST-запрос к моему веб-серверу (даже сбои) в БД. Мой код для аудита загромождал мой контроллер. Может кто-нибудь предложить соответствующий шаблон дизайна, чтобы сделать его чистым, универсальным и ремонтопригодным.

@JsonView(View.Student.class)
@PostMapping("/updateStudent")
public Student updateStudent(@Valid @RequestBody final Student  studentConfig) {

    Student oldStudentDefn =                        
                  repository.findById(studentConfig.getStudentId())
                     .map(Function.identity()).orElse(null);

    final AuditBuilder builder = aAuditBuilder().withAction("UPDATE")
        .withSource("GUI")
        .withBeforeObj(oldStudentDefn)
        .withAfterObj(studentConfig);

    try{
        if(repository.save(studentConfig)) {
            builder.withStatus("Success");
        } else {
            throw new ApplicationException(" Student Save failed");
        }
    }catch(ApplicationException e) {
        builder.withStatus("Failure");
                    throw e;
    }

    finally {
        auditService.save(builder.build());
    }

}

Я хочу рефакторинг таким образом, чтобы этот повторяющийся конструктор try-catch для каждой конечной точки отправлялся в общую службу и был достаточно универсален для принятия любого типа объекта, поэтому что даже конечные точки Teacher, Section, ProgressReport и т. д. также могут быть проверены путем вызова той же службы, но она не должна иметь дублирования кода.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Опираясь на большой отклик Кароля (https://stackoverflow.com/a/54160447/8231165), Я бы также предложил использовать существующую платформу для ваших нужд.

Одним из примеров может быть отправка журналов через приложение / кодировщик Logstash для Logback, а затем сохранение / манипулирование ими через стек ELK (подробнее здесь: https://www.baeldung.com/java-application-logs-to-elastic-stack). Logstash имеет богатый список выходных плагинов, таких как один для MongoDB.

Еще одной альтернативой может быть публикация событий журнала в брокере сообщений, таком как RabbitMQ, и затем предоставление потребителю делать все, что ему нужно, для хранения этих событий в базе данных.

Кстати, весь этот код try-catch-finally можно поместить в отдельный метод (возможно, в класс Util).

0 голосов
/ 12 января 2019

С Spring Boot вы, скорее всего, встраиваете контейнер сервлета. Вместо того, чтобы разрабатывать эту функцию самостоятельно, вы можете использовать возможности контейнеров сервлетов, например Tomcat имеет журнал доступа , конфигурируемый с помощью AccessLogValve. Этого должно быть достаточно, чтобы вывести файл журнала, а затем преобразовать и импортировать в базу данных.

Если вам нужно решение в реальном времени, вы можете обратиться к библиотекам мониторинга, таким как Jaeger или Микрометр .

Дело в том, что есть более простые способы получить эту функцию, чем написание собственного кода, если только у вас нет особых требований.

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