SpringBoot全局异常处理

article/2025/9/14 0:17:32

文章目录

  • 异常处理方案分类
    • 基于请求转发
    • 基于异常处理器
    • 基于过滤器
  • 常见异常处理实现方案
    • 1. BasicExceptionController
    • 2. @ExceptionHandler
    • 3. @ControllerAdvice+@ExceptionHandler
    • 4. SimpleMappingExceptionResolver
    • 5. HandlerExceptionResolver
    • 6. Filter
  • 全局异常处理实现方案
    • 1. 请求转发
    • 2. 异常处理器+请求转发补充
    • 3. 过滤器
    • 4. 异常处理器+过滤器补充
    • 注意事项
    • 方案推荐


异常处理方案分类

异常处理主要分为三类:

  1. 基于请求转发的方式处理异常;
  2. 基于异常处理器的方式处理异常;
  3. 基于过滤器的方式处理异常。

基于请求转发

基于请求转发的异常处理方式是真正的全局异常处理。

实现方式有:

  • BasicExceptionController

基于异常处理器

基于异常处理器的异常处理方式其实并不是真正的全局异常处理,因为它处理不了过滤器等抛出的异常。

实现方式有:

  • @ExceptionHandler
  • @ControllerAdvice+@ExceptionHandler
  • SimpleMappingExceptionResolver
  • HandlerExceptionResolver

基于过滤器

基于过滤器的异常处理方式近似与全局异常处理。它能处理过滤器及之后的环节抛出的异常。

实现方式有:

  • Filter

常见异常处理实现方案

1. BasicExceptionController

这是SpringBoot默认处理异常方式:一旦程序中出现了异常SpringBoot就会请求/error的url,在SpringBoot中提供了一个叫BasicExceptionController的类来处理/error请求,然后跳转到默认显示异常的页面来展示异常信息。显示异常的页面也可以自定义,在目录src/main/resources/templates/下定义一个叫error的文件,可以是jsp也可以是html 。

此种方式是通过请求转发实现的,出现异常时,会转发到请求到/error,该接口对异常进行处理返回。是最符合全局异常处理的。

可以自定义Controller继承BasicErrorController异常处理来实现异常处理的自定义。

@Slf4j
@RestController
public class MyErrorController extends BasicErrorController {public MyErrorController() {super(new DefaultErrorAttributes(), new ErrorProperties());}/*** produces 设置返回的数据类型:application/json* @param request 请求* @return 自定义的返回实体类*/@Override@RequestMapping(value = "", produces = {MediaType.APPLICATION_JSON_VALUE})public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {// 获取错误信息Map<String, Object> body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL));HttpStatus status = getStatus(request);String code = body.get("status").toString();String message = body.get("message").toString();return new ResponseEntity(ApiUtil.fail(message), HttpStatus.OK);}
}

需要注意

  1. 该种方式能获取到的信息时有限的。一般情况只能获取到下面这几个参数(特殊情况会有补充参数)。
    在这里插入图片描述

    现在一般项目需要的响应信息都是自定义统一格式的JSON(code、msg、data)。对于自定义业务错误码code不好得到,对于错误信息msg有时得到的也不一定是你所想要的(简单说就是一些特殊的异常描述信息不好得到)。

    比如:自定义的参数校验信息

    @NotNull(message = "主键不能为空")
    

    在这里插入图片描述
    message参数取到的并不是“主键不能为空”。

  2. 当出现抛出两次异常,第一次被异常处理器处理,第二次异常转由BasicExceptionController处理。但能取到的异常信息可能是一次的,具体原因下面有分析。

2. @ExceptionHandler

该种方式只能作用于使用@ExceptionHandler注解的Controller的异常,对于其他Controller的异常就无能为力了,所以并不不推荐使用。

此种方式是通过异常处理器实现的,使用HandlerExceptionResolverComposite异常处理器中的ExceptionHandlerExceptionResolver异常处理器处理的。

@RestController
public class TestController {@GetMapping("test9")public FundInfo test9() throws Exception {throw new Exception("test9 error");}@GetMapping("test10")public FundInfo test10() throws Exception {throw new IOException("test10 error");}@ExceptionHandler(Exception.class)public ApiResult exceptionHandler(Exception e) {return ApiUtil.custom(500, e.getMessage());}
}

注意:如果既在具体Controller使用了@ExceptionHandler,也定义了全局异常处理器类(@ControllerAdvice+@ExceptionHandler),优先使用Controller定义的@ExceptionHandler处理。如果处理不了,才会使用全局异常处理器处理。

3. @ControllerAdvice+@ExceptionHandler

使用 @ControllerAdvice+@ExceptionHandler注解能够进行近似全局异常处理,这种方式推荐使用

一般说它只能处理控制器中抛出的异常,这种说法并不准确,其实它能处理DispatcherServlet.doDispatch方法中DispatcherServlet.processDispatchResult方法之前捕捉到的所有异常,包括:拦截器、参数绑定(参数解析、参数转换、参数校验)、控制器、返回值处理等模块抛出的异常。

此种方式是通过异常处理器实现的,使用HandlerExceptionResolverComposite异常处理器中的ExceptionHandlerExceptionResolver异常处理器处理的。

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {......省略代码......try {ModelAndView mv = null;Exception dispatchException = null;try {......省略代码......mappedHandler = getHandler(processedRequest);......省略代码......HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());......省略代码......if (!mappedHandler.applyPreHandle(processedRequest, response)) {return;}......省略代码......mv = ha.handle(processedRequest, response, mappedHandler.getHandler());if (asyncManager.isConcurrentHandlingStarted()) {return;}......省略代码......mappedHandler.applyPostHandle(processedRequest, response, mv);}catch (Exception ex) {dispatchException = ex;}catch (Throwable err) {dispatchException = new NestedServletException("Handler dispatch failed", err);}processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);}catch (Exception ex) {......省略代码......}catch (Throwable err) {......省略代码......}finally {......省略代码......}
}

使用方式

定义一个类,使用@ControllerAdvice注解该类,使用@ExceptionHandler注解方法。@RestControllerAdvice注解是@ControllerAdvice注解的扩展(@RestControllerAdvice=@ControllerAdvice+@ResponseBody),返回值自动为JSON的形式。

/*** 全局异常处理器*/
@Slf4j
@SuppressWarnings("ALL")
@RestControllerAdvice
public class MyGlobalExceptionHandler {@ExceptionHandler(BindException.class)@ResponseStatus(HttpStatus.OK)public ApiResult bindException(HttpServletRequest request,HttpServletResponse response,BindException exception) {return ApiUtil.fail(exception.getBindingResult().getFieldError().getDefaultMessage());}@ExceptionHandler(org.springframework.web.bind.MethodArgumentNotValidException.class)@ResponseStatus(HttpStatus.OK)public ApiResult methodArgumentNotValidException(HttpServletRequest request,HttpServletResponse response,MethodArgumentNotValidException exception) {return ApiUtil.fail(exception.getBindingResult().getFieldError().getDefaultMessage());}@ExceptionHandler(MissingServletRequestParameterException.class)@ResponseStatus(HttpStatus.OK)public ApiResult methodArgumentNotValidException(HttpServletRequest request,HttpServletResponse response,MissingServletRequestParameterException exception) {return ApiUtil.fail(exception.getMessage());}@ExceptionHandler(ConstraintViolationException.class)@ResponseStatus(HttpStatus.OK)public ApiResult methodArgumentNotValidException(HttpServletRequest request,HttpServletResponse response,ConstraintViolationException exception) {System.out.println(exception.getLocalizedMessage());Iterator<ConstraintViolation<?>> iterator = exception.getConstraintViolations().iterator();if (iterator.hasNext()) {ConstraintViolationImpl next = (ConstraintViolationImpl)iterator.next();return ApiUtil.fail(next.getMessage());}return ApiUtil.fail(exception.getMessage());}@ExceptionHandler(Exception.class)@ResponseStatus(HttpStatus.OK)public ApiResult exception(HttpServletRequest request,HttpServletResponse response,Exception exception) {return ApiUtil.fail(exception.getMessage());}
}

@ResponseStatus注解

作用:指定http状态码,正确执行时返回该状态码,但方法执行报错时,该返回啥状态码就是啥状态码,指定的状态码无效。

4. SimpleMappingExceptionResolver

使用简单映射异常处理器处理异常,通过配置SimpleMappingExceptionResolver类也是进行近似全局异常处理,但该种方式不能得到具体的异常信息,且返回的是视图不推荐使用

此种方式是通过异常处理器实现的,使用SimpleMappingExceptionResolver异常处理器处理的。

@Configuration
public class GlobalExceptionConfig {@Beanpublic SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();/*** 参数一:异常的类型,这里必须要异常类型的全名* 参数二:要跳转的视图名称*/Properties mappings = new Properties();mappings.put("java.lang.ArithmeticException", "error1");mappings.put("java.lang.NullPointerException", "error1");mappings.put("java.lang.Exception", "error1");mappings.put("java.io.IOException", "error1");// 设置异常与视图的映射信息resolver.setExceptionMappings(mappings);return resolver;}
}

5. HandlerExceptionResolver

实现HandlerExceptionResolver接口来处理异常,该种方式是近似全局异常处理

此种方式是通过异常处理器实现的,使用自定义的异常处理器(实现HandlerExceptionResolver接口)处理的。

public class MyExceptionResolver extends AbstractHandlerExceptionResolver {/*** 异常解析器的顺序, 数值越小,表示优先级越高* @return*/@Overridepublic int getOrder() {return -999999;}@Overrideprotected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {response.setContentType(MediaType.APPLICATION_JSON_VALUE);try {response.getWriter().write(JSON.toJSONString(ApiUtil.fail(ex.getMessage())));} catch (IOException e) {e.printStackTrace();}return null;}
}

AbstractHandlerExceptionResolver类实现了HandlerExceptionResolver接口。

6. Filter

基于过滤器的异常处理方式,比异常处理器处理的范围要大一些(能处理到Filter过滤器抛出的异常),更近似全局异常处理。使用自定义过滤器进行异常处理时,该过滤器应该放到过滤链的第一个位置,这样才能保证能处理到后续过滤器抛出的异常。

    @BeanExceptionFilter exceptionFilter() {return new ExceptionFilter();}@Beanpublic FilterRegistrationBean exceptionFilterRegistration() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(exceptionFilter());registration.setName("exceptionFilter");//此处尽量小,要比其他Filter靠前registration.setOrder(-1);return registration;}
/*** 自定义异常过滤器* 用于处理Controller外抛出的异常(如Filter抛出的异常)*/
@Slf4j
public class ExceptionFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException,IOException {try {filterChain.doFilter(httpServletRequest, httpServletResponse);} catch (IOException e) {httpServletResponse.getWriter().write(JSON.toJSONString(ApiUtil.fail(e.getMessage())));}}
}

上面的写法其实还是有一定问题的,如果进入了catch就会重复写入httpServletResponse,可能会导致产生一些列的问题。

举例一个问题来说明,通过上面的写法,这样的对响应的写入一般是累加的,可能会导致返回的数据格式有问题,比如:当异常处理器处理了Controller抛出的异常,写入了响应,然后过滤器又抛出了异常,被ExceptionFilter给catch到,这就有一次处理了异常,写入了响应,最后的到的响应数据可能是这样的:

{"code": 500,"msg": "Controller error"
}{"code": 505,"msg": "Filter error"
}

这个时候我们一般会使用代理类来再次封装Response,filterChain.doFilter传递的是封装后的代理类。

Response代理类

/*** Response代理类*/
public class ResponseWrapper extends HttpServletResponseWrapper {private ByteArrayOutputStream outputStream = new ByteArrayOutputStream();private PrintWriter printWriter = new PrintWriter(outputStream);public ResponseWrapper(HttpServletResponse response) {super(response);}@Overridepublic ServletOutputStream getOutputStream() throws IOException {return new ServletOutputStream() {@Overridepublic boolean isReady() {return false;}@Overridepublic void setWriteListener(WriteListener writeListener) {}@Overridepublic void write(int b) throws IOException {outputStream.write(b);}@Overridepublic void write(byte[] b) throws IOException {outputStream.write(b);}@Overridepublic void write(byte[] b, int off, int len) throws IOException {outputStream.write(b, off, len);}@Overridepublic void flush() throws IOException {outputStream.flush();}};}@Overridepublic PrintWriter getWriter() throws IOException {return printWriter;}public void flush(){try {printWriter.flush();printWriter.close();outputStream.flush();outputStream.close();} catch (IOException e) {e.printStackTrace();}}public byte[] getContent() {flush();return outputStream.toByteArray();}
}

自定义过滤器类修改为

@Slf4j
public class ExceptionFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException,IOException {try {// 封装Response,得到代理对象ResponseWrapper responseWrapper = new ResponseWrapper(httpServletResponse);// 使用代理对象filterChain.doFilter(httpServletRequest, responseWrapper);// 读取响应内容byte[] bytes = responseWrapper.getContent();// 这里可以对响应内容进行修改等操作// 模拟Filter抛出异常if (true) {throw new IOException("Filter error");}// 内容重新写入原响应对象中httpServletResponse.getOutputStream().write(bytes);} catch (Exception e) {httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);httpServletResponse.getOutputStream().write(JSON.toJSONString(ApiUtil.fail(e.getMessage())).getBytes());}}
}

全局异常处理实现方案

要想实现正在的全局异常处理,显然只通过异常处理器的方式处理是不够的,这种方案处理不了过滤器等抛出的异常。

全局异常处理的几种实现方案:

  • 基于请求转发
  • 基于异常处理器+请求转发补充
  • 基于过滤器
  • 基于异常处理器+过滤器补充

1. 请求转发

该方案貌似不好获取到特殊的异常描述信息(没仔细研究),如参数校验中的message属性信息:

@NotNull(message = "主键不能为空")

本方案通过自定义错误处理Controller继承BasicExceptionController来实现。

具体实现参考:常用异常处理实现方案1

2. 异常处理器+请求转发补充

(1)自定义异常处理Controller实现BasicExceptionController
具体实现参考:常用异常处理实现方案1

(2)异常处理器实现

  • 方式1:@ControllerAdvice+@ExceptionHandler(推荐使用
    具体实现参考:常用异常处理实现方案3
  • 方式2:SimpleMappingExceptionResolver
    具体实现参考:常用异常处理实现方案4
  • 方式3:HandlerExceptionResolver
    具体实现参考:常用异常处理实现方案5

3. 过滤器

具体实现参考:常用异常处理实现方案6

4. 异常处理器+过滤器补充

创建自定义过滤器bean

    @BeanExceptionFilter exceptionFilter() {return new ExceptionFilter();}@Beanpublic FilterRegistrationBean exceptionFilterRegistration() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(exceptionFilter());registration.setName("exceptionFilter");//此处尽量小,要比其他Filter靠前registration.setOrder(-1);return registration;}
  • 方式1:@ControllerAdvice+@ExceptionHandler+Filter(推荐使用

    • @ControllerAdvice+@ExceptionHandler的实现参考:常用异常处理实现方案3
    • Filter实现:
      • 方式1:参考常用异常处理实现方案6
      • 方式2:借助异常处理器处理异常
        @Slf4j
        public class ExceptionFilter extends OncePerRequestFilter {/*** 遇到的坑,ExceptionFilter对象的创建没有交给Spring容器(直接new的),导致@Autowired注入不会生效*/@Autowiredprivate HandlerExceptionResolver handlerExceptionResolver;@Overrideprotected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException,IOException {try {// 封装Response,得到代理对象ResponseWrapper responseWrapper = new ResponseWrapper(httpServletResponse);// 使用代理对象filterChain.doFilter(httpServletRequest, responseWrapper);// 读取响应内容byte[] bytes = responseWrapper.getContent();// 这里可以对响应内容进行修改等操作// 模拟Filter抛出异常if (true) {throw new IOException("Filter error");}// 内容重新写入原响应对象中httpServletResponse.getOutputStream().write(bytes);} catch (Exception e) {handlerExceptionResolver.resolveException(httpServletRequest, httpServletResponse, null, e);}}
        }
        
        注入的HandlerExceptionResolver其实是HandlerExceptionResolverComposite异常处理器,最终是使用异常处理器中的ExceptionHandlerExceptionResolver异常处理器处理的。
  • 方式2:HandlerExceptionResolver+Filter

    • HandlerExceptionResolver的实现参考:常用异常处理实现方案5
    • Filter的实现:
      • 方式1:参考常用异常处理实现方案6
      • 方式2:借助异常处理器处理异常
        @Slf4j
        public class ExceptionFilter extends OncePerRequestFilter {@Autowiredprivate MyExceptionResolver myExceptionResolver;@Overrideprotected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException,IOException {try {// 封装Response,得到代理对象ResponseWrapper responseWrapper = new ResponseWrapper(httpServletResponse);// 使用代理对象filterChain.doFilter(httpServletRequest, responseWrapper);// 读取响应内容byte[] bytes = responseWrapper.getContent();// 这里可以对响应内容进行修改等操作// 模拟Filter抛出异常if (true) {throw new IOException("Filter error");}// 内容重新写入原响应对象中httpServletResponse.getOutputStream().write(bytes);} catch (Exception e) {myExceptionResolver.resolveException(httpServletRequest, httpServletResponse, null, e);}}
        }
      注入的MyExceptionResolver是我们自定义的异常处理器。

注意事项

  1. 2、4两种通过组合的方式进行异常处理需要考虑到的问题:对于一个请求,如果两个地方都捕捉到了异常,要考虑两次异常处对response响应信息的重复写入问题。

    比如:异常处理器处理了控制器抛出的异常,写入响应;过滤器处理了过滤器抛出的异常,写入响应。这就会出现响应被写入了两次的问题或者第二次写入响应直接报错。

    一些处理思路:考虑使用Response代理类。第一次处理时,异常处理器写入的响应信息是写入到Response代理对象的,并可以从Response代理类中得到写入的响应信息;第二次处理,过滤器等写入的响应写入到Response原对象中的。

  2. 过程中发现一个问题:通过BasicExceptionController+异常处理器处理异常的方式时。Controller抛出了异常,被异常处理器处理,返回的过程中,Filter又抛出了一个异常,被BasicExceptionController处理,但BasicExceptionController的到的异常信息却是Controller产生的异常信息,而不是Filter产生的异常信息。但是调到BasicExceptionController去处理异常又却是是因为Filter抛出异常产生的。

    个人猜想:异常处理器在处理异常时,不仅是把响应内容部部分写入了Response,还把异常信息写入了Response。当因为异常跳转到BasicExceptionController进行处理,BasicExceptionController在获取异常信息时,会先从Response获取异常信息,获取不到才会从异常中获取异常信息

方案推荐

  1. 请求转发推荐)。完全统一的全局异常处理,自定义异常处理Controller能达到自定义统一响应信息格式目的。

    但是,现在一般项目需要的响应信息都是自定义统一格式的JSON(code、msg、data)。但对于自定义业务错误码code不好得到,对于错误信息msg有时得到的也不一定是你所想要的。

    但感觉通过自定义的扩展是能得到业务状态码和特殊异常描述信息的(没详细研究)。

  2. 异常处理+请求转发补充个人最推荐)。推荐使用@ControllerAdvice+@ExceptionHandler+BasicExceptionController的方式。

    异常处理器能自定义处理大多异常(包括特殊的异常),剩余处理不到的异常交给异常处理控制器处理。

  3. 过滤器不推荐)。异常处理全需要手写代码实现,自己的代码肯定不会太完美,可能有没考虑到的情况,容易出问题;且过滤器之前抛出的异常处理不到。

  4. 异常处理器+过滤器补充不太推荐)。推荐使用@ControllerAdvice+@ExceptionHandler+Filter(借助异常处理器处理异常)的方式,但过滤器之前抛出的异常处理不到。


参考文章:spring boot response重写


http://chatgpt.dhexx.cn/article/9wWdF6Ik.shtml

相关文章

springboot整合之统一异常处理

特别说明&#xff1a;本次项目整合基于idea进行的&#xff0c;如果使用Eclipse可能操作会略有不同&#xff0c;不过总的来说不影响。 springboot整合之如何选择版本及项目搭建 springboot整合之版本号统一管理 springboot整合mybatis-plusdurid数据库连接池 springboot整合…

C++ 异常处理

目录 一、异常的定义 二、异常的抛出和捕获 1.throw 2.try...catch 3.异常安全 4.异常规范 三、系统预定义异常 四、用户自定义异常 一、异常的定义 异常在C用于错误处理&#xff0c;C语言中一般使用返回值表示错误&#xff0c;C对错误处理进行了扩展&#xff0c;统一使…

关于异常处理的知识整理

目录 1.什么是异常&#xff1f; 2.异常继承结构 3.异常结构继承图 4.关于异常处理的两种方式&#xff1a; 5.异常对象有两个非常重要的方法 1.什么是异常&#xff1f; 程序在执行过程中不正常的情况称为异常&#xff0c;以类和对象的形势存在&#xff0c;可以通过异常类&am…

异常处理---

异常 异常处理 例&#xff1a; public class Demo{public static void main(String[] args) {System.out.println("开始");method();System.out.println("结束");}public static void method(){int[] arr{1,2,3};System.out.println(arr[3]);//数组索引…

异常处理

1.相关概念的介绍 1&#xff09;异常情形&#xff1a;是指阻止当前方法或作用域继续执行的问题。 2&#xff09;监控区域&#xff1a;一段可能产生异常的代码&#xff0c;并且后面跟着处理这些异常的代码。 3&#xff09;try块&#xff1a;如果在方法的内部或者在方法内部调…

异常及异常处理

一、异常的概念 定义&#xff1a; 异常指的是运行期出现的错误&#xff0c;也就是当程序开始执行以后执行期出现的错误。 处理态度&#xff1a; 当捕获到异常以后一定要做出处理&#xff0c;哪怕是把这个异常的错误信息打印出来&#xff0c;这是一种良好的编程习惯。 …

异常处理(throw、throws、try-catch)

Java异常处理的五个关键字try、catch、finally、throw、throws 1.抛出异常throw 在编写程序时&#xff0c;我们必须要考虑程序出现问题的情况。比如&#xff0c;在定义方法时&#xff0c;方法需要接收参数。那么&#xff0c;当调用方法使用接收到的参数时&#xff0c;首先需要…

SpringBoot+Axis2搭建WebService服务端

SpringBootAxis2搭建WebService服务端 之前用过Spring Axis2搭建过WebService项目&#xff0c;网上也有很多资料教程&#xff0c;最近需要在一个SpringBoot项目中添加Axis2的服务端&#xff0c;在网上找了很久&#xff0c;没有找到相关教程&#xff0c;最终经过大神朋友的指点…

AXI(2)完结

四、握手 4.1握手过程 所有的五个通道都是通过相同的VALID/READY握手处理来传输地址、数据和控制信息。 双向握手的机制意味着主机和从机之间传输数据时&#xff0c;都可以控制传输的速率&#xff0c;只有当VALID和READY同时为高电平时&#xff0c;传输才会发生。 发送方&a…

读Axis2用户帮助文档 (axis2中文文档)

作者&#xff1a;李红霞 时间&#xff1a;2006-10-19 声明&#xff1a;本文可以算作Axis2用户手册的翻译&#xff0c;但是翻译后的文本是经过作者理解写出来的&#xff0c;可能有些偏差&#xff0c;欢迎讨论。本文属作者原创&#xff0c;允许转载&#xff0c;但请注明出处。 英…

AXI 3.0 (1)

一、AXI简介 AMBA3.0中新增加了一种总线——AXI&#xff08;Advanced eXtensible Interface&#xff0c;高级扩展接口&#xff09;。 AMBA AXI 协议的目标是高性能、高频的系统设计&#xff0c;其包含了若干特性。 适合高带宽和低延迟的设计 提供高频操作&#xff0c;无需使…

Apache axis2 + Eclipse 开发 WebService

一、简介 Apache Axis2是下一代 Apache Axis。Axis2 虽然由 Axis 1.x 处理程序模型提供支持&#xff0c;但它具有更强的灵活性并可扩展到新的体系结构。Axis2 基于新的体系结构进行了全新编写&#xff0c;而且没有采用 Axis 1.x 的常用代码。支持开发 Axis2 的动力是探寻模块化…

Axis2与Web项目整合

一、说明: 上一篇介绍了通过使用Axis2来发布和调用WebService&#xff0c;但是是把WebService发布在Axis2提供的项目中&#xff0c;如果我们需要在自己的Web项目中来使用Axis2发布WebService该怎么做呢&#xff1f; 本篇即介绍在Web项目中使用Axis2来发布WebService. 二、具体…

Axis2中文手册

中文原文 http://tenn.javaeye.com/blog/100736 英文原文 http://ws.apache.org/axis2/1_0/userguide.html 概述 这个说明文档涉及以下内容&#xff1a;  如何使用 axis2 创建 web service 和客户端程序  如何定制一个模块 (Module) 并在 web service 中使用它  Sam…

axis2的使用(转载)

通过axis2发起WS请求时添加SOAP header 首先要获得一个ServiceClient对象&#xff0c;因为这个对象是org.apache.axis2.client.Stub里面定义的&#xff0c;所以你生成的stub里面应该直接就可以使用这个对象&#xff0c;或者调用stub的_getServiceClient()方法来获取这个对象。 …

SpringBoot2 整合 AXIS2 服务端和客户端

文章目录 一、AXIS2服务端1. 版本选型2.导入依赖3. services.xml4.Axis2配置类5.服务接口6.服务接口实现类7. FileCopyUtils工具类8. 测试验证 二、AXIS2服务端2.1. 客户端类2.2. 服务调用测试开源源码. 一、AXIS2服务端 1. 版本选型 阿健/框架版本spring-boot2.5.5axis21.7.…

WebService之Axis2系列教程(一)Axis2的下载、安装和使用

Axis2是目前比较流行的WebService引擎。WebService被应用在很多不同的场景。例如&#xff0c;可以使用WebService来发布服务端 Java类的方法&#xff0c;以便使用不同的客户端进行调用。这样可以有效地集成多种不同的技术来完成应用系统。WebService还经常被使用在SOA中&#x…

Axis2 webservice学习总结

一、学习课件目录&#xff1a; Axis2(WebService)培训资料1 - 百度文库 (baidu.com) WebService大讲堂之Axis2 - 百度文库 (baidu.com) 二、学习总结&#xff1a; Web Service是构建互联网分布式系统的基本部件&#xff0c;它是一个应用程序&#xff0c;它向外界暴露出一个…

小白轻松使用axis2构建webservice

引言&#xff1a; 使用axis2是来实现webservice接口是比较常见的&#xff0c;就我来说&#xff0c;如果要学一个首次接触东西&#xff0c;简单了解相关基础概念后&#xff0c;就希望自己能够简单快速的实现一个例子&#xff0c;在学习一门开发语言的时候&#xff0c;一个hello…

模板引擎 Velocity语法

Velocity是一个基于java的模板引擎&#xff08;template engine&#xff09;&#xff0c;它允许任何人仅仅简单的使用模板语言&#xff08;template language&#xff09;来引用 由java代码定义的对象。作为一个比较完善的模板引擎&#xff0c;Velocity的功能是比较强大的&…