Solon v4.x 更新与兼容说明
2026年5月26日 下午6:32:22
1、纪年
- v0: 2018 ~ 2019 (2y)
- v1: 2020 ~ 2022 (3y)
- v2: 2023 ~ 2024 (2y)
- v3: 2024 ~ 2026 (1.5y)
- v4: 2026 ~
2、v3.x 升到 v4.x 提醒
- 提醒1:之前没有使用弃用接口的,可以直接升级
- 提醒2:有使用弃用接口的。建议先升级到 3.10.7;替换弃用代码后,再升级到 4.0.0
3、弃用配置移除对应表(要认真核对)
移除
| 应用或插件 | 移除配置名 | 替代配置名 | |
|---|---|---|---|
| solon-server | server.session.state.domain | server.session.cookieDomain | |
server.session.state.domain.auto | server.session.cookieDomainAuto | ||
| solon-web-staticfiles | solon.staticfiles.maxAge | solon.staticfiles.cacheMaxAge | |
| nacos2-solon-cloud-plugin | solon.cloud.nacos2.* | solon.cloud.nacos.* |
4、弃用插件移除对应表(要认真核对)
移除(以下插件已由项目官方仓库维护,或者直接使用即可)
| 移除插件 | 替代插件 | |
|---|---|---|
easy-trans-solon-plugin | com.fhs-opensource:easy-trans-solon-plugin | |
sms4j-solon-plugin | org.dromara.sms4j:sms4j-solon-plugin | |
beetlsql-solon-plugin | com.ibeetl:sql-solon-plugin | |
dbvisitor-solon-plugin | net.hasor:dbvisitor-solon | |
sqltoy-solon-plugin | com.sagframe:sagacity-sqltoy-solon-plugin | |
mybatis-sqlhelper-solon-plugin | com.github.fangjinuo.sqlhelper:sqlhelper-mybatis | |
mybatis-pagehelper-solon-plugin | com.github.pagehelper:pagehelper | |
mybatis-plus-solon-plugin | com.baomidou:mybatis-plus-solon-plugin | |
mybatis-plus-extension-solon-plugin | 同上 | |
mybatis-flex-solon-plugin | com.mybatis-flex:mybatis-flex-solon-plugin | |
fastmybatis-solon-plugin | net.oschina.durcframework:fastmybatis-solon-plugin | |
bean-searcher-solon-plugin | cn.zhxu:bean-searcher-solon-plugin | |
mybatis-tkmapper-solon-plugin | tk.mybatis:mapper-solon-plugin | |
sa-token-solon-plugin | cn.dev33:sa-token-solon-plugin | |
sa-token-snack4 | 同上 | |
sa-token-dao-redisson-jackson | 同上 | |
liteflow-solon-plugin | com.yomahub:liteflow-solon-plugin | |
forest-solon-plugin | com.dtflys.forest:forest-solon-plugin |
5、弃用注解或属性移除对应表(会有编译提醒)
移除注解或属性
| 应用或插件 | 弃用注解或属性 | 替代注解或属性 | |
|---|---|---|---|
| solon | org.noear.solon.annotation:: | ||
@Bean:priority() | @Condition:priority() | ||
@Bean:injected() | @Bean:autoInject() | ||
| solon-data | org.noear.solon.data.annotation:: | ||
@Tran | @Transaction | ||
| nami | org.noear.nami.annotation:: | ||
@NamiBody:contentType() | @NamiMapping:headers() |
6、Solon 生态弃用类或方法移除对应表(会有编译提醒)
- solon 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| solon | 包(org.noear.solon) | ||
Solon:start(NvMap) | / | ||
SolonApp:add*() | SolonApp:router():add*() | ||
SolonApp:filter*() | SolonApp:router():filter*() | ||
SolonApp:get*() | SolonApp:router():get*() | ||
SolonApp:post*() | SolonApp:router():post*() | ||
SolonApp:head*() | SolonApp:router():head*() | ||
SolonApp:put*() | SolonApp:router():put*() | ||
SolonApp:patch*() | SolonApp:router():patch*() | ||
SolonApp:delete*() | SolonApp:router():delete*() | ||
SolonApp:socketd*() | SolonApp:router():socketd*() | ||
SolonApp:delete*() | SolonApp:router():delete*() | ||
SolonApp:converterManager() | SolonApp:converters() | ||
SolonApp:serializerManager() | SolonApp:serializers() | ||
SolonApp:renderManager() | SolonApp:renders() | ||
SolonApp:factoryManager() | SolonApp:factories() | ||
SolonApp:renderManager() | SolonApp:renders() | ||
SolonApp:chainManager() | SolonApp:chains() | ||
SolonProps:plugs*() | SolonProps:plugins*() | ||
SolonProps:plugsSort*() | / | ||
SolonProps:isAloneMode*() | / | ||
Utils:async*() | RunUtil:async*() | ||
| solon | 包(org.noear.solon.util) | ||
| / | ScopeLocal:getOr | ||
| solon | 包(org.noear.solon.core) | ||
AppContext:methodGet | AppContext:methodWrap | ||
AppContext:prestop | AppContext:preStop | ||
BeanContainer:wrapPublish | BeanContainer:beanPublish | ||
Constants:HEADER_CONTENT_TYPE_DEF | MimeType.TEXT_PLAIN_UTF8_VALUE | ||
ChainManager:getInterceptorNodes | ChainManager:getRouterInterceptorNodes | ||
ChainManager:addInterceptor | ChainManager:addRouterInterceptor | ||
ChainManager:addInterceptorIfAbsent | ChainManager:addRouterInterceptorIfAbsent | ||
ChainManager:removeInterceptor | ChainManager:removeRouterInterceptor | ||
ChainManager:defExecuteHandler | ChainManager:defEntityConverter | ||
ChainManager:addExecuteHandler | ChainManager:addEntityConverter | ||
ChainManager:removeExecuteHandler | ChainManager:removeEntityConverter | ||
ChainManager:getExecuteHandler | / | ||
ChainManager:getExecuteHandlerDefault | / | ||
FactoryManager:hasMvcFactory() | / | ||
FactoryManager:mvcFactory() | / | ||
FactoryManager:mvcFactory() | / | ||
Plugin:prestop() | Plugin:preStop() | ||
new Props(Map) | new Props().addAll(Map) | ||
new Props(Iterable<KeyValues>) | new Props().addAll(Iterable<KeyValues>) | ||
Props:getBean(..) | Props:toBean(..) | ||
VarHolder:getGenericType()->ParameterizedType | VarHolder:getGenericType()->Type | ||
NvMap | / | ||
MvcFactory | / | ||
LifecycleIndex | / | ||
| solon | 包(org.noear.solon.core.handle) | ||
ActionArgumentResolver | MethodArgumentResolver | ||
ActionExecuteHandler | / | ||
ContextHolder | / | ||
ContextUtil | / | ||
EntityConverterFromExecutor | / | ||
RenderFactory | / | ||
| solon | 包(org.noear.solon.core.route) | ||
Router:getAll(..) | Router:findAll(...) | ||
Router:getBy(..) | Router:findBy(...) | ||
RouterWrapper | / | ||
Routing:target() | Routing:target(version2) | ||
RoutingTable:matchOne(..) | RoutingTable:matchOne(..., version) | ||
RoutingTable:matchOneAndStatus(..) | RoutingTable:matchOneAndStatus(..., version) | ||
RoutingTable:matchMore(..) | RoutingTable:matchMore(..., version) | ||
| solon | 包(org.noear.solon.core.util) | ||
ClassUtil:findPublicMethods(..) | / | ||
ClassUtil:scanClasses(.., Predicate<Class<?>>) | ClassUtil:scanClasses(.., Consumer<Class<?>>) | ||
ResourceUtil:scanClasses(..) | ClassUtil:scanClasses(...) | ||
ScanUtil:setScanner(..) | / | ||
LogUtil | / | ||
PathAnalyzer | PathMatcher | ||
| solon | 包(org.noear.solon.core.wrap) | ||
VarSpec:getType | VarSpec:getTypeEggg().getType | ||
VarSpec:getGenericType | VarSpec:getTypeEggg().getGenericType | ||
VarSpec:isGenericType | VarSpec:getTypeEggg().isParameterizedType |
- solon-handle 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| solon-handle | 包(org.noear.solon.core.mvc) | ||
ActionExecuteHandlerDefault | EntityConverterDefault |
- solon-data 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| solon-data | 包(org.noear.solon.data.tran) | ||
TranManager:currentSet | TranManager:with | ||
TranManager:currentRemove | TranManager:with | ||
TranManager:trySuspend | TranManager:with | ||
TranManager:tryResume | TranManager:with | ||
| solon-data | 包(org.noear.solon.data.tran.interceptor) | ||
TranInterceptor | TransactionInterceptor |
- solon-data-dynamicds 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| solon-data-dynamicds | 包(org.noear.solon.data.dynamicds) | ||
DynamicDataSource:setCurrentKey | DynamicDsKey:use | ||
DynamicDsKey:remove | DynamicDsKey:with | ||
DynamicDsKey:use | DynamicDsKey:with | ||
DynamicDsKey:getCurrent | DynamicDsKey:with | ||
DynamicDsKey:setCurrent | DynamicDsKey:with | ||
DynamicDsUtils | / |
- solon-flow 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| solon-flow | 包(org.noear.solon.flow) | ||
FlowContext:model() | FlowContext:data() | ||
FlowContext:vars() | FlowContext:data() | ||
Link:getCondition | Link:getWhen | ||
LinkSpec:condition | LinkSpec:when |
- solon-net-httputils 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| solon-net-httputils | 包(org.noear.solon.net.http.textstream) | ||
ServerSentEvent:id() | ServerSentEvent:getId() | ||
ServerSentEvent:event() | ServerSentEvent:getEvent() | ||
ServerSentEvent:data() | ServerSentEvent:getData() | ||
ServerSentEvent:retry() | ServerSentEvent:getRetry() | ||
ServerSentEvent:comment() | ServerSentEvent:getComment() | ||
TextStreamUtil:parseLineStream(.., subscriber) | TextStreamUtil:parseLineStream(...)->Flux | ||
TextStreamUtil:parseSseStream(.., subscriber) | TextStreamUtil:parseSseStream(...)->Flux | ||
| solon-net-httputils | 包(org.noear.solon.net.http) | ||
HttpExtensionManager | HttpConfiguration | ||
HttpResponse:contentEncoding | HttpResponse:contentCharset | ||
HttpUtils:execAsTextStream | HttpUtils:execAsLineStream | ||
HttpUtils:execAsEventStream | HttpUtils:execAsSseStream | ||
HttpUtils:bodyRaw | HttpUtils:body | ||
HttpUtils:bodyTxt | HttpUtils:bodyOfTxt | ||
HttpUtils:bodyJson | HttpUtils:bodyOfJson |
- solon-statemachine 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| solon-statemachine | 包(org.noear.solon.statemachine) | ||
Event | / | ||
State | / |
- solon-server 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| solon-server | 包(org.noear.solon.server.ssl) | ||
SslContextFactory | SslContextBuilder | ||
| solon-server | 包(org.noear.solon.server) | ||
ServerProps.request_useTempfile | / |
- solon-serialization 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| solon-serialization | 包(org.noear.solon.serialization.prop) | ||
JsonPropsUtil | / | ||
| solon-serialization | 包(org.noear.solon.serialization) | ||
BytesSerializerRender | / | ||
ContextSerializer | / | ||
JsonRenderFactory | / | ||
BytesSerializerRender | / | ||
StringSerializerRender | / | ||
| solon-serialization-abc | 包(org.noear.solon.serialization.abc) | ||
AbcActionExecutor | / | ||
AbcRender | / | ||
| solon-serialization-fastjson | 包(org.noear.solon.serialization.fastjson) | ||
FastjsonActionExecutor | / | ||
FastjsonRenderFactory | / | ||
FastjsonRenderFactoryBase | / | ||
FastjsonRenderTypedFactory | / | ||
| solon-serialization-fastjson2 | 包(org.noear.solon.serialization.fastjson2) | ||
Fastjson2ActionExecutor | / | ||
Fastjson2RenderFactory | / | ||
Fastjson2RenderFactoryBase | / | ||
Fastjson2RenderTypedFactory | / | ||
| solon-serialization-fury | 包(org.noear.solon.serialization.fury) | ||
FuryActionExecutor | / | ||
FuryRender | / | ||
| solon-serialization-gson | 包(org.noear.solon.serialization.gson) | ||
GsonActionExecutor | / | ||
GsonRenderFactory | / | ||
GsonRenderFactoryBase | / | ||
GsonRenderTypedFactory | / | ||
| solon-serialization-hessian | 包(org.noear.solon.serialization.hessian) | ||
HessianActionExecutor | / | ||
HessianRender | / | ||
| solon-serialization-jackson | 包(org.noear.solon.serialization.jackson) | ||
JacksonActionExecutor | / | ||
JacksonRenderFactory | / | ||
JacksonRenderFactoryBase | / | ||
JacksonRenderTypedFactory | / | ||
| solon-serialization-jackson-xml | 包(org.noear.solon.serialization.jackson.xml) | ||
JacksonXmlActionExecutor | / | ||
JacksonXmlRenderFactory | / | ||
JacksonXmlRenderFactoryBase | / | ||
JacksonXmlRenderTypedFactory | / | ||
| solon-serialization-kryo | 包(org.noear.solon.serialization.kryo) | ||
KryoActionExecutor | / | ||
KryoRender | / | ||
| solon-serialization-properties | 包(org.noear.solon.serialization.properties) | ||
PropertiesActionExecutor | / | ||
PropertiesRenderFactory | / | ||
| solon-serialization-protostuff | 包(org.noear.solon.serialization.protostuff) | ||
ProtostuffActionExecutor | / | ||
ProtostuffRender | / | ||
| solon-serialization-snack3 | 包(org.noear.solon.serialization.snack3) | ||
SnackActionExecutor | / | ||
SnackRenderFactory | / | ||
SnackRenderFactoryBase | / | ||
SnackRenderTypedFactory | / |
- solon-web 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| solon-web-sse | 包(org.noear.solon.web.sse) | ||
SseEvent:build | SseEvent:toString |
- solon-integration 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| dubbo3-solon-plugin | 包(org.noear.solon.extend.dubbo3) | ||
EnableDubbo | org.apache.dubbo.solon.annotation.EnableDubbo | ||
| dubbo-solon-plugin | 包(org.noear.solon.extend.dubbo) | ||
EnableDubbo | org.apache.dubbo.solon.annotation.EnableDubbo | ||
| redisson-solon-plugin | 包(org.redisson.solon) | ||
RedissonSupplier | RedissonClientOriginalSupplier |
- nami 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| nami | 包(org.noear.nami) | ||
EncoderTyped | / | ||
NamiAttachment | NamiAttach | ||
EncoderTyped | / | ||
| nami | 包(org.noear.nami.common) | ||
Constants | ContentTypes | ||
| nami-coder-fastjson | 包(org.noear.nami.coder.fastjson) | ||
FastjsonTypeEncoder | / | ||
| nami-coder-fastjson2 | 包(org.noear.nami.coder.fastjson2) | ||
Fastjson2TypeEncoder | / | ||
| nami-coder-jackson | 包(org.noear.nami.coder.jackson) | ||
JacksonTypeEncoder | / | ||
| nami-coder-snack3 | 包(org.noear.nami.coder.snack3) | ||
SnackTypeEncoder | / |
7、Solon AI 生态弃用类或方法移除对应表(会有编译提醒)
- solon-ai-core 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| solon-ai-core | 包(org.noear.solon.ai.core) | ||
ChatMessage.template() | ChatMessage.ofUserTmpl() | ||
ChatMessage.augment() | ChatMessage.ofUserAugment() | ||
UserMessageTemplate.param() | UserMessageTemplate.paramAdd() | ||
InMemoryChatSession:new(..,systemMessages) | / | ||
InMemoryChatSession.Builder.systemMessages() | / | ||
ToolCallResultConverter.matched() | / | ||
ChatConfig.defaultToolsContext | ChatConfig.defaultToolContext (配置要注意) | ||
ChatConfig.addDefaultTools() | ChatConfig.addDefaultTool() | ||
ChatConfig.isDefaultAutoToolCall() | ChatConfig.getModelOptions().isAutoToolCall() | ||
ChatConfig.getDefaultInterceptors() | ChatConfig.getModelOptions().interceptors() | ||
ChatConfig.getDefaultToolContext() | ChatConfig.getModelOptions().toolContext() | ||
ChatConfig.getDefaultSkills() | ChatConfig.getModelOptions().skills() | ||
ChatConfig.getDefaultOptions() | ChatConfig.getModelOptions().options() | ||
ChatConfig.getDefaultTool() | ChatConfig.getModelOptions().tool() | ||
ChatConfig.getDefaultTools() | ChatConfig.getModelOptions().tools() | ||
ChatConfig.getDefaultToolsContext() | ChatConfig.getModelOptions().toolContext() | ||
ChatModel.prompt(session) | / | ||
ChatModel.defaultToolAdd(toolObj) | / | ||
ChatOptions.optionAdd() | ChatOptions.optionSet() | ||
ChatOptions.toolsAdd() | ChatOptions.toolAdd() | ||
ChatOptions.toolsContext() | ChatOptions.toolContext() | ||
ChatOptions.toolsAdd() | ChatOptions.toolAdd() | ||
ChatSession.toNdjson() | ChatMessage.toNdjson(session.getMessages()) | ||
ChatSession.loadNdjson() | ChatMessage.fromNdjson(ndjson, session::addMessage) | ||
ChatSessionDefault | / | ||
EmbeddingOptions.optionAdd() | EmbeddingOptions.optionSet() | ||
GenerateOptions.optionAdd() | GenerateOptions.optionSet() | ||
RerankingOptions.optionAdd() | RerankingOptions.optionSet() | ||
RepositoryStorable.asyncInsert() | RepositoryStorable.asyncSave() | ||
RepositoryStorable.insert() | RepositoryStorable.save() | ||
RepositoryStorable.delete() | RepositoryStorable.deleteById() | ||
RepositoryStorable.exists() | RepositoryStorable.existsById() |
- solon-ai-agent 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| solon-ai-agent | 包(org.noear.solon.ai.agent) | ||
ReActAgent.description() | ReActAgent.role() | ||
ReActAgent.maxStepsExtensible() | ReActAgent.autoRethink() | ||
ReActOptionsAmend.maxStepsExtensible() | ReActOptionsAmend.autoRethink() | ||
ReActTrace.pending() | AgentSession.pending() | ||
ReActTrace.isPending() | AgentSession.isPending() | ||
ReActTrace.getPendingReason() | AgentSession.getPendingReason() | ||
SimpleAgent.description() | SimpleAgent.role() | ||
TeamAgent.description() | TeamAgent.role() | ||
TeamTrace.pending() | AgentSession.pending() | ||
TeamTrace.isPending() | AgentSession.isPending() | ||
TeamTrace.getPendingReason() | AgentSession.getPendingReason() |
- solon-ai-harness 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| solon-ai-harness | 包(org.noear.solon.ai.harness) | ||
HarnessEngine.Builder.extensionAdd() | / | ||
HarnessProperties.maxStepsAutoExtensible() | HarnessProperties.autoRethink() |
- solon-ai-mcp 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| solon-ai-mcp | 包(org.noear.solon.ai.mcp) | ||
McpClientProperties.apiKey("xxx") | .header("Authorization", "Bearer xxx") | ||
McpClientProperties.apiUrl() | McpClientProperties.url() | ||
McpClientProvider.Builder.apiUrl() | McpClientProvider.Builder.url() | ||
McpClientProvider.Builder.apiKey() | McpClientProvider.Builder.header("Authorization", "Bearer xxx") | ||
McpClientProvider.Builder.headerSet() | McpClientProvider.Builder.header() | ||
McpClientProvider.Builder.serverParameters() | McpClientProvider.Builder.command() | ||
McpServerParameters.Builder | / |
- solon-ai-repo 移除类或方法
| 应用或插件 | 移除类或方法名 | 替代类或方法名 | |
|---|---|---|---|
| solon-ai-repo-dashvector | 包(org.noear.solon.ai.rag.repository) | ||
DashVectorRepository.metadataIndexFields() | DashVectorRepository.metadataFields() | ||
| solon-ai-repo-redis | 包(org.noear.solon.ai.rag.repository) | ||
RedisRepository.metadataIndexFields() | RedisRepository.metadataFields() |