Download Latest Version Solon v3.6.0 source code.tar.gz (3.1 MB)
Email in envelope

Get an email when there's a new version of Solon

Home / v3.6.0
Name Modified Size InfoDownloads / Week
Parent folder
README.md 2025-10-02 4.2 kB
Solon v3.6.0 source code.tar.gz 2025-10-02 3.1 MB
Solon v3.6.0 source code.zip 2025-10-02 6.6 MB
Totals: 3 Items   9.7 MB 3
  • 新增 solon-server-grizzly 插件
  • 新增 solon-server-grizzly-add-websocket 插件
  • 新增 solon-server-tomcat 插件(基于 tomcat v9.0 适配)
  • 新增 solon-server-tomcat-jakarta 插件(基于 tomcat v11.0 适配)
  • 新增 solon-server-undertow-jakarta 插件(基于 undertow v2.3 适配)
  • 完善 solon-server-jetty-jakarta 插件(基于 jetty v12 适配)
  • 完善 solon-server-jetty-add-jsp-jakarta 插件(基于 jetty v12 适配)
  • 完善 solon-server-jetty-add-websocket-jakarta 插件(基于 jetty v12 适配)
  • 调整 solon-serialization-* 弱化 ActionExecuteHandler, Render 的定制,改为 XxxxSerializer 对外定制
  • 调整 solon LogIncubator 接口迁移到内核,由内核控制加载时机(权重提高)
  • 调整 solon EntityConverter 接口(替代 Render 和 ActionExecuteHandler 接口),旧接口仍可用
  • 调整 solon SolonProps:argx 改为 MultiMap 类型(支持多值),NvMap 标为弃用
  • 引入 slf4j-api 替代 solon 内的 LogUtil(减少中转代码)
  • 引入 solon-expression 替代 solon 内的模板表达式工具(仍可使用)
  • 添加 solon Condition:onExpression(采用 SnEL 表达式)用于替代 onProperty(标为弃用)
  • 添加 solon SnelUtil(基于 SnEL 且兼容旧的 TmplUtil) 替代 TmplUtil(标为弃用)//如果有 # 则为新表达式
  • 添加 solon-mvc List<UploadedFile> 注入支持(用 UploadedFile[] 性能更好)
  • 添加 solon-server 所有 http-server 适配 server.request.fileSizeThreshold 配置支持(重要升级)
  • 添加 solon converters,serializers,renders,factories,chains(简化名自:converterManager,serializerManager,renderManager,factoryManager,chainManager)
  • snakeyaml 升为 2.5
  • lombok 升为 1.18.42
  • jansi 升为 2.4.2
  • guava 升为 33.4.8-jre
  • log4j 升为 2.25.1
  • fury 升为 0.10.3
  • smart-http 升为 2.5.13
  • reactor-core 升为 3.7.4
  • graalvm.buildtools 升为 0.11.0

示例:

:::java
@Managed
public class SerializerDemo {
    //ps: 这前需要使用 Fastjson2RenderFactory, Fastjson2ActionExecutor 两个对象,且表意不清晰 //(仍可使用)
    @Managed
    public void config(Fastjson2StringSerializer serializer) {
        //序列化(输出用)
        serializer.addEncoder(Date.class, s -> s.getTime());

        serializer.addEncoder(Date.class, (out, obj, o1, type, i) -> {
            out.writeInt64(((Date) obj).getTime());
        });

        serializer.getSerializeConfig().addFeatures(JSONWriter.Feature.WriteMapNullValue); //添加特性
        serializer.getSerializeConfig().removeFeatures(JSONWriter.Feature.BrowserCompatible); //移除特性
        serializer.getSerializeConfig().setFeatures(JSONWriter.Feature.BrowserCompatible); //重设特性

        //反序列化(收接用)
        serializer.getDeserializeConfig().addFeatures(JSONReader.Feature.Base64StringAsByteArray);
    }
}

@Managed
public class ConditionDemo(){
    //ps: 之前是用 onProperty(功能有限,不够体系化) //(仍可使用)
    @Condition(onExpression = "${demo.level:1} == '1'") //SnEL 求值表达式
    @Managed
    public void ifDemoLevel1ThenRun(){
        System.out.println("hi!");
    }
}

@Managed
public class SnelDemo {
    //ps: 之前基于 TmplUtil 实现(功能有限,不够体系化) //(仍可使用) //旧模板符号:`${}`
    @Cache(key = "oath_#{code}", seconds = 10) //SnEL 模板表达式(通过 SnelUtil 实现兼容)//新模板符号:`#{}`
    public Oauth queryInfoByCode(String code) {
        return new Oauth(code, LocalDateTime.now());
    }

    @CachePut(keys = "oath_#{result.code}") //(result 为返回结果)
    public Oauth updateInfo(Oauth oauth) {
        return oauth;
    }

    @CacheRemove(keys = "oath_#{oauth.code}")
    public void removeInfo(Oauth oauth) {

    }
}
Source: README.md, updated 2025-10-02