Spring boot generi c обработчик исключений для SOAP прокси-клиента - PullRequest
0 голосов
/ 30 января 2020

У меня есть класс-оболочка, который вызывает веб-сервис через прокси-клиент jar. Я обнаружил, что пишу одну и ту же попытку \ улов для разных методов для этого клиента. Я видел, что есть способ создания обобщенных c обработчиков исключений для классов Controller, но это не так. Есть ли способ, которым я могу иметь Spring или какой-то другой метод написания try \ catch один раз и повторного его использования для каждого из клиентских вызовов?

Пример:

@org.springframework.stereotype.Service
public class proxyClient{

  public int method a(){
     try { 
        return client.a()
     }
     catch(Exception1 e){}
     catch(Exception2 e){}
     return null;
  }
  public int method b(){
     try { 
        return client.b()
     }
     catch(Exception1 e){}
     catch(Exception2 e){}
     return null;
  } 
  public int method c(){
     try { 
        return client.c()
     }
     catch(Exception1 e){}
     catch(Exception2 e){}
     return null;
  }
}

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

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Наиболее распространенный и причудливый способ сделать это - использовать AOP ( Аспектно-ориентированное программирование ), поскольку обработка исключений является сквозной задачей, которую эта парадигма призвана улучшить .

Вы можете создать аспект Совет для обработки исключений, генерируемых любым сервисом (при условии, что есть даже другие) в вашем пакете (здесь упоминается как some.package.service). , поскольку вы не предоставили полный контент класса):

package some.package.aop;

import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.Configuration;

@Configuration
@Aspect
public class ExceptionHandlerPointcut {

    @AfterThrowing(pointcut = "execution(* some.package.service.*.*(..))", throwing = "ex")
    public void handleException(Exception ex) {
        // your common exception management code
    }

}

Обязательно аннотируйте класс своей основной конфигурации (или приложения с весенней загрузкой) с помощью @EnableAspectJAutoProxy для расширения @Aspect обнаружения классов.

0 голосов
/ 31 января 2020

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

Если вы решите перебросить, то любой компонент, использующий ProxyClient, должен будет либо try-catch, либо перебросить.

С учетом сказанного вы можете использовать Supplier<T> и создайте служебный метод для вызова метода:

@Service
public class ProxyClient {

    public Integer method a() {
        return doAction(client::b);
    }

    public Integer method b() {
        return doAction(client::b);
    }

    public Integer method c() {
        return doAction(client::c);
    }

    public Integer doAction(Supplier<Integer> action) {
        try {
            return action.get();
        } catch (Exception1 e) {
            // ...
        } catch (Exception2 e) {
            // ...
        }
        return null;
    }
}

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

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