Какие у меня есть варианты, если я хочу проксировать все сервисные вызовы, чтобы я мог соответствующим образом регистрировать их без явного вызова регистратора? - PullRequest
1 голос
/ 06 июля 2011

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

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

Лесозаготовка - сквозная проблема Вы можете использовать АОП для этого. Посмотрите на AspectJ или Spring AOP.

0 голосов
/ 06 июля 2011

Вы можете рассмотреть возможность использования динамических прокси для реализации уровня обслуживания.

Он использует API отражения, поэтому все вызовы методов для вашего кода сервиса будут проходить через один метод "invoke", где вы можете регистрировать вызовы служб, параметры методов и сообщения об исключениях.

public class MyServiceProxy implements InvocationHandler {
            public static Object newInstance(Object obj) {
                    return java.lang.reflect.Proxy.newProxyInstance(
        obj.getClass().getClassLoader(),
        obj.getClass().getInterfaces(),
        new MyServiceProxy(obj));
        }

             public Object invoke(Object proxy, Method m, Object[] args) {
                   // Log method name , parameters etc.
                   try {
                       method.invoke(proxy, args) ;
                   }
                   catch(InvocationTargetException e) {
                      // log your exceptions and do other things
                      throw e.getTargetException();
                   }
             }

Где бы вы ни позвонили в службу, вы бы вместо этого сделали это

          MyService myServiceRef = (MyService)MyServiceProxy.newInstance(new MyService());
...