Rest service request/response handler

0

Hej,
mam pytanko.

Mam zewnętrznego liba podłączonego pod projekt (lib może być modyfikowany).
Jest to lib do komunikacji REST.

W serwisie który korzysta z tego liba buduje request, przekazuje do komponentu z liba, lib robi calla RESTowego i zwraca wynik.

Pytane moje brzmi czy da się jakoś zrobić jakiś handler aby każdy request który przechodzi przez liba i każdy response był zapisywany do bazy?

Chodzi mi o jakiś generyczny sposób, że wszystko co przechodzi przez apiClient.call() było zapisywane do bazy.

dzięki

0
  1. Wersja "normalna" -> zrób swoją klasę która opakowuje tą restową libkę i wszystkie requesty przesyłaj przez tą klasę. Wtedy masz tylko jeden entry point i możesz sobie spokojnie tam logować co chcesz. Ten twój "serwis" brzmi właśnie jak takie miejsce... Trzeba by tam dodać jeszcze odbieranie responsów.
  2. Wersja na hardkora, na przykład jeśli tej libki używasz już w setkach miejść i nie da rady tego zrefaktorować, a także kiedy nie bardzo jest jak ogarnąć odbieranie wyników -> AOP. Zakładasz sobie jakieś after na tą twoją metodę i logujesz aspektem. Minus tego rozwiązania jest taki, że potem ktoś spędzi 3 dni próbując rozkminić jak to się dzieje że te logi się pojawiają, skoro nigdzie w kodzie używającym tej restowej libki nie ma nic z tym związanego... ;]
0

Dzięki,
właśnie o taki AOP mi chodziło chyba, sprawdzę dokładniej.

0

A jednak myslalem ze to bedzie prostrze :)
Nie moge odpalic aspekta.
I tutaj pytanie.

Mam metode w jakims tam pakiecie
com.dummy.api

I teraz tak
Klasa to Class a metoda to

 invoke(String param1, String param2).

Czyli cala sciezka do metody wyglada tak

com.dummy.api.Class.invoke().

Zrobilem taki aspekt:

	@Before("execution(* com.dummy.api.Class.invoke())")
	public void logAuditBefore(JoinPoint joinPoint) {

		LOGGER.info("BEFORE");

	}

Co jeszcze zrobilem to cala ta klasa z aspektami ma

@Aspect

i dodalem

<aop:aspectj-autoproxy />

P.S. A miało być tak pieknie ;)

0

I pytanie jeszcze. Czy da sie jakos sprawdzić czy aspekty w ogole poprawnie się załadowały?

0

Jeśli nie piszesz kodu lodówką to zarówno IntelliJ jak i Eclipse (z jakąśtam wtyczką do AOP) pokazują kiedy metoda łapie sie na jakiś aspekt.

0

To chyba wygląda na problem związany z tym że metoda na która chce założyć aspekt to jest w zewnętrznym libie .

0

aaa no tak, żeby zrobić coś takiego jak chcesz to musisz użyć spring-aop a nie aspectj, bo aspectj modyfikuje bajtkod przy kompilacji, co u ciebie nie zadziała. Spring robi swoje aop za pomocą obiektów proxy więc zadziała także dla bibliotek.

1
Shalom napisał(a):

[...] nie aspectj, bo aspectj modyfikuje bajtkod przy kompilacji

To tylko jeden z wariantów użycia aspectj. Pozostałe warianty, które tu zadziałają:

  1. Przeróbka jara przy użyciu aspectj. Wchodzi jar z plikami class oryginalnymi, wychodzi zawirusowany przez aspectj.
  2. Używamy agenta aspectj z maszyną wirtualną.

Metoda 2 daje jakiś narzut wydajnościowy. 1 jest chyba do zaakceptowania na produkcji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1