Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SOAP代理客户端的Spring引导通用异常处理程序_Java_Spring_Spring Boot_Spring Mvc - Fatal编程技术网

Java SOAP代理客户端的Spring引导通用异常处理程序

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 {

我有一个包装器类,它通过代理客户端jar调用web服务。我发现自己为这个客户端的不同方法编写了相同的try\catch。我看到有一种方法可以为控制器类创建通用异常处理程序,但事实并非如此。有没有一种方法可以让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;
  }
}

我希望能够有一些东西为我处理这些异常,这样我就可以减少代码重复,但我只希望为这个类完成它

如果异常是,那么您必须像现在这样使用
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技巧,我想知道是否还有其他巧妙的方法可以做到这一点