Java SOAP代理客户端的Spring引导通用异常处理程序
我有一个包装器类,它通过代理客户端jar调用web服务。我发现自己为这个客户端的不同方法编写了相同的try\catch。我看到有一种方法可以为控制器类创建通用异常处理程序,但事实并非如此。有没有一种方法可以让spring或其他方法编写一次try\catch并对每个客户端调用重用它 例如:Java SOAP代理客户端的Spring引导通用异常处理程序,java,spring,spring-boot,spring-mvc,Java,Spring,Spring Boot,Spring Mvc,我有一个包装器类,它通过代理客户端jar调用web服务。我发现自己为这个客户端的不同方法编写了相同的try\catch。我看到有一种方法可以为控制器类创建通用异常处理程序,但事实并非如此。有没有一种方法可以让spring或其他方法编写一次try\catch并对每个客户端调用重用它 例如: @org.springframework.stereotype.Service public class proxyClient{ public int method a(){ try {
@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;
}
}
我希望能够有一些东西为我处理这些异常,这样我就可以减少代码重复,但我只希望为这个类完成它 如果异常是,那么您必须像现在这样使用try catch
处理它们,或者简单地通过向方法添加throws ExceptionClassName
来重新抛出异常
如果您选择重新抛出,那么使用ProxyClient
的任何组件都需要尝试catch
或重新抛出
也就是说,您可以使用并创建一个实用方法来调用该方法:
@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;
}
}
@服务
公共类代理客户端{
公共整数方法a(){
返回doAction(客户端::b);
}
公共整数方法b(){
返回doAction(客户端::b);
}
公共整数方法c(){
返回doAction(客户端::c);
}
公共整数操作(供应商操作){
试一试{
返回操作。get();
}捕获(例外1 e){
// ...
}捕获(例外2 e){
// ...
}
返回null;
}
}
如果抛出任何异常,除了返回
null
,您似乎没有从示例中执行任何操作。因此,我不确定您对Spring的期望是什么。最常见和最奇特的方法是使用AOP(面向方面编程),因为异常处理是一个交叉关注点,此范例旨在增强这一点
您可以创建方面建议来处理包下的任何服务(假设还有其他服务)引发的异常(这里称为some.package.service,因为您没有提供完整的类内容):
package some.package.aop;
导入org.aspectj.lang.annotation.afterhrowing;
导入org.aspectj.lang.annotation.Aspect;
导入org.springframework.context.annotation.Configuration;
@配置
@面貌
公共类例外HandlerPointcut{
@后throwing(pointcut=“execution(*some.package.service.*.*.*(..)”,throwing=“ex”)
公共无效句柄异常(异常除外){
//您的通用异常管理代码
}
}
确保使用
@enableSpectjautoproxy
注释您的主配置(或spring boot应用程序)类,以启用@Aspect
类发现。您能否提供一个包含类和实例的最小结构化代码?您提供了两个具有相同签名的方法。我不确定您在问什么,但关于异常混乱,我只会在任何地方使用throws
关键字,并在顶级处理异常:@tmarwen updated。假设“客户机”是我的服务代理,它进行web服务调用。因此,我的类公开了一个a、b和c方法,然后调用代理客户端并返回结果。它过于简化,逻辑性更强,但对于这个例子,我只是想展示一下redundancy@Kilves-我曾考虑过抛出异常,并将处理异常的逻辑提高到一个级别,但我看到在控制器级别有一些针对通用处理程序的spring技巧,我想知道是否还有其他巧妙的方法可以做到这一点