Solon v3.6.2

Web 请求处理过程示意图(AOP)

</> markdown

关键接口预览

1、Filter, 过滤器(环绕式)

@FunctionalInterface
public interface Filter {
    /**
     * 过滤
     * */
    void doFilter(Context ctx, FilterChain chain) throws Throwable;
}

2、RouterInterceptor, 路由拦截器(环绕式)

public interface RouterInterceptor {
    /**
     * 路径匹配模式(控制拦截的路径区配)
     * */
    default PathRule pathPatterns(){
        //null 表示全部
        return null;
    }
    
    /**
     * 拦截
     */
    void doIntercept(Context ctx,
                     @Nullable Handler mainHandler,
                     RouterInterceptorChain chain) throws Throwable;

    /**
     * 提交结果(action / render 执行前调用)
     */
    default Object postResult(Context ctx, @Nullable Object result) throws Throwable {
        return result;
    }
}

在路由拦截阶段,已经从路由器里找出 Main Handler(并作为拦截时的参数):

  • 可能是 null
  • 可能是 Handler 或它的扩展类(Actoin、Gateway 等)

同时也产生默认状态码:

  • 可能是 404
  • 可能是 405(有路由记录,但是 http mehtod 不匹配)

3、EntityConverter(实体转换器)、MethodArgumentResolver(方法参数分析器)

EntityConverter 的作用有两个(一般使用 Solon Serialization 插件即可):

  • Request Body(form、json 等) 转换成 @Mapping 方法的参数。
  • @Mapping 方法的返回结果(或 ctx.returnValue()),输出到 Reponse Body。(会自动转换为 Render)
public interface EntityConverter {
    //实例检测(移除时用)
    default boolean isInstance(Class<?> clz) {
        return clz.isInstance(this);
    }

    //名字
    default String name() {
        return this.getClass().getSimpleName();
    }

    //关系映射
    default String[] mappings() {
        return null;
    }

    //是否允许写
    boolean allowWrite();

    //是否能写
    boolean canWrite(String mime, Context ctx);

    //写入并返回(渲染并返回(默认不实现))
    String writeAndReturn(Object data, Context ctx) throws Throwable;

    //写入
    void write(Object data, Context ctx) throws Throwable;

    //是否允许读
    boolean allowRead();

    //是否能读
    boolean canRead(Context ctx, String mime);

    //读取(参数分析)
    Object[] read(Context ctx, Object target, MethodWrap mWrap) throws Throwable;
}

MethodArgumentResolver 的作用,是为@Mapping 方法的某一个参数提供分析支持。

public interface MethodArgumentResolver {
    //是否匹配
    boolean matched(Context ctx, ParamWrap pWrap);

    //参数分析
    Object resolveArgument(Context ctx, Object target, MethodWrap mWrap, ParamWrap pWrap, int pIndex, LazyReference bodyRef) throws Throwable;
}

4、MethodInterceptor, 拦截器(环绕式)

被代理的托管对象,在执行方法时,会先执行 MethodInterceptor。

@FunctionalInterface
public interface MethodInterceptor {
    /**
     * 拦截
     * */
    Object doIntercept(Invocation inv) throws Throwable;
}

//绑定 MethodInterceptor 接口实现
@Around(MethodInterceptor.class)

5、ReturnValueHandler,返回值处理

比如返回 Flux<String>(响应式流)、SseEmitter(SSE发射器),是在扩展插件实现的。通过注册 ReturnValueHandler 实现扩展处理。

public interface ReturnValueHandler {
    //是否匹配
    boolean matched(Context ctx, Class<?> returnType);

    //返回处理
    void returnHandle(Context ctx, Object returnValue) throws Throwable;
}

6、Render 渲染器

负责渲染输出。比如模板渲染并输出,序列化渲染并输出。

@FunctionalInterface
public interface Render {
    //名字
    default String name() {
        return this.getClass().getSimpleName();
    }

    //映射
    default String[] mappings() {
        return null;
    }

    //是否匹配
    default boolean matched(Context ctx, String mime) {
        return false;
    }

    //渲染并返回(默认不实现)
    default String renderAndReturn(Object data, Context ctx) throws Throwable {
        return null;
    }

    //渲染
    void render(Object data, Context ctx) throws Throwable;
}