Spring Boot 2.x集成WebService实战:CXF与JAX-WS选型及避坑指南
1. 为什么还要在Spring Boot 2.x里集成WebService第一次接到这个需求的时候我其实愣了一下。现在都2025年了前后端分离、RESTful API、gRPC满天飞怎么还有人用WebService后来跟对方聊完才明白对接的是一个跑了快十年的老系统对方只认SOAP协议WSDL文件就是他们的接口文档改不动。这种场景在传统行业里太常见了——银行、保险、制造业的ERP、政务系统很多核心服务还是WebService那一套。所以这篇内容就是把我踩过的坑、试过的方案完整梳理一遍。核心关键词就几个Spring Boot 2.x、WebService、SOAP、WSDL、CXF、JAX-WS。如果你手头正好有一个Spring Boot项目需要对外暴露WebService接口或者需要调用第三方的WebService服务这篇内容能帮你少走至少两天的弯路。我假设你已经有Spring Boot的基础知道怎么建项目、怎么写Controller、怎么用Maven。如果你连这些都不熟建议先去补一下基础再来。下面所有内容都是基于Spring Boot 2.x版本具体来说我用的是2.7.x这个版本在依赖兼容性上比较稳不会遇到太多莫名其妙的坑。整篇内容会从方案选型开始讲然后一步步搭建服务端和客户端最后把我在实际项目中遇到的典型问题整理成排查表。代码都是可以直接复制运行的参数配置我也会解释清楚为什么这么设。2. 方案选型CXF、JAX-WS还是Spring Web Services2.1 三种主流方案的对比在Spring Boot里集成WebService市面上主要有三条路可以走。我一开始也纠结了很久后来把三个方案都跑了一遍才确定用哪个。方案核心依赖优点缺点适用场景Apache CXFcxf-spring-boot-starter-jaxws功能全、文档多、社区活跃依赖较重、配置略繁琐服务端客户端都要用接口复杂JAX-WS RIspring-boot-starter-web-services轻量、Spring官方支持客户端调用不够灵活只做服务端暴露Spring Web Servicesspring-ws-core契约优先、灵活度高学习曲线陡、配置多对WSDL有精细控制需求我最终选了Apache CXF原因很直接这个项目既要对外暴露服务又要调用对方的服务CXF两边都能搞定而且它对JAX-WS注解的支持最完整。JAX-WS RI虽然轻但客户端那块用起来不够顺手Spring Web Services更适合契约优先的场景配置量太大不适合快速交付。提示如果你的项目只是单纯暴露一个WebService接口给外部调用不涉及客户端调用用spring-boot-starter-web-services就够了依赖更少启动更快。2.2 版本兼容性为什么必须锁定版本Spring Boot 2.x和CXF的版本对应关系是个大坑。我一开始没注意直接用了最新版的CXF结果启动就报NoSuchMethodError。后来查了半天才发现是版本不匹配。经过实测下面这几个组合是稳定的Spring Boot 2.7.x CXF 3.5.xSpring Boot 2.3.x CXF 3.4.xSpring Boot 2.1.x CXF 3.3.x我用的组合是Spring Boot 2.7.18 CXF 3.5.5这个组合在我三个项目里都跑得很稳。如果你用的是Spring Boot 2.0.x那CXF得降到3.2.x否则会有兼容性问题。注意千万不要在pom里同时引入cxf-spring-boot-starter-jaxws和spring-boot-starter-web-services两者会有类冲突启动时直接报Bean定义冲突。2.3 依赖引入的正确姿势Maven依赖这块我建议只引必要的不要图省事引一堆。下面是我实际用的配置dependency groupIdorg.apache.cxf/groupId artifactIdcxf-spring-boot-starter-jaxws/artifactId version3.5.5/version /dependency就这一个就够了它会自动把cxf-core、cxf-rt-frontend-jaxws、cxf-rt-transports-http这些传递依赖都带进来。不需要额外引spring-boot-starter-web因为CXF的starter已经包含了。如果你需要客户端调用再加一个dependency groupIdorg.apache.cxf/groupId artifactIdcxf-rt-frontend-jaxws/artifactId version3.5.5/version /dependency其实这个也在starter里了一般不用单独加。我提这一嘴是因为有些教程会让你加加了也不报错但没必要。3. 服务端搭建从接口定义到WSDL发布3.1 接口定义的关键细节服务端这块第一步是定义接口。JAX-WS的注解不多但每个都有讲究。我直接上代码然后逐个解释WebService( name UserService, targetNamespace http://service.example.com/, serviceName UserService, portName UserServicePort ) public interface UserService { WebMethod(operationName getUserInfo) WebResult(name userInfo) UserInfo getUserInfo( WebParam(name userId) XmlElement(required true) String userId ); WebMethod(operationName listUsers) WebResult(name userList) ListUserInfo listUsers( WebParam(name pageNo) int pageNo, WebParam(name pageSize) int pageSize ); }这里有几个点必须说清楚targetNamespace这个一定要设而且要有意义。如果不设CXF会默认用包名倒序生成一个比如http://service.example.com/。问题是一旦服务发布出去这个namespace就固定了客户端拿到的WSDL里就是这个值。如果以后改包名namespace就变了所有客户端都得重新生成代码。所以一开始就要定好用公司域名倒序最稳妥。name和serviceNamename是端口类型名serviceName是服务名。这两个在WSDL里对应不同的元素。我见过有人只设一个结果WSDL里出现两个不同的名字客户端生成代码时容易混淆。建议两个都设而且保持一致。WebParam的name这个决定了SOAP消息里参数的标签名。如果不设默认是arg0、arg1这种客户端调用时传参很容易搞错。一定要设成有意义的英文名。XmlElement(required true)这个注解是给JAXB用的表示该元素必须存在。加上之后如果客户端不传这个参数服务端会直接报错而不是收到null。对于必填参数强烈建议加上。3.2 实现类的编写要点接口定义好了实现类就简单了但有几个坑要注意WebService( serviceName UserService, targetNamespace http://service.example.com/, endpointInterface com.example.service.UserService ) Component public class UserServiceImpl implements UserService { Override public UserInfo getUserInfo(String userId) { // 业务逻辑 UserInfo info new UserInfo(); info.setUserId(userId); info.setUserName(测试用户); return info; } Override public ListUserInfo listUsers(int pageNo, int pageSize) { // 分页逻辑 return new ArrayList(); } }endpointInterface这个必须设而且值必须是接口的全限定名。如果不设CXF会把实现类当成服务端点WSDL里会出现实现类里的所有public方法包括那些不该暴露的。我踩过这个坑当时实现类里有个辅助方法结果被暴露到WSDL里了客户端能直接调很尴尬。Component这个注解是让Spring管理这个BeanCXF的starter会自动扫描带有WebService的Bean并发布。如果你不用Component就得手动配置Endpoint麻烦很多。不要加WebMethod在实现类上注解都写在接口上实现类只写Override。如果在实现类上也写WebMethod可能会和接口上的冲突导致WSDL里出现重复的操作。3.3 配置类与Servlet注册CXF在Spring Boot里需要一个配置类来注册Servlet。这个配置类很简单但少了它服务就发布不了Configuration public class CxfConfig { Bean public ServletRegistrationBeanCXFServlet cxfServlet() { return new ServletRegistrationBean( new CXFServlet(), /ws/* ); } Bean(name Bus.DEFAULT_BUS_ID) public SpringBus springBus() { return new SpringBus(); } Bean public Endpoint endpoint(UserService userService) { EndpointImpl endpoint new EndpointImpl(springBus(), userService); endpoint.publish(/UserService); return endpoint; } }路径规划Servlet注册在/ws/*Endpoint发布在/UserService最终访问路径就是http://localhost:8080/ws/UserService?wsdl。这个路径规划要提前想好因为一旦发布出去客户端就按这个地址调改起来很麻烦。SpringBus这个Bean的名字必须是Bus.DEFAULT_BUS_ID也就是cxf。如果名字不对CXF会创建默认的Bus你的配置就不生效了。这个坑我踩过当时Bean名字写成了springBus结果自定义的拦截器死活不生效查了一下午才发现是Bus名字的问题。Endpoint的publish路径这个路径是相对于Servlet路径的。如果你写/UserService完整路径就是/ws/UserService。建议和接口的serviceName保持一致方便管理。3.4 验证服务是否发布成功启动项目后浏览器访问http://localhost:8080/ws/UserService?wsdl如果能看到XML格式的WSDL文档说明服务发布成功了。WSDL文档里重点看几个地方wsdl:service的name属性应该是UserServicewsdl:port的binding属性应该指向正确的namespacewsdl:types里的schema应该包含你定义的所有参数和返回类型如果WSDL打不开先看启动日志有没有报错再看Servlet路径对不对。最常见的问题是路径冲突比如你的Controller也映射了/ws开头的路径那就冲突了。4. 客户端调用三种方式与选型建议4.1 动态代理调用最灵活客户端调用WebServiceCXF提供了JaxWsProxyFactoryBean这是最灵活的方式Configuration public class WsClientConfig { Bean public UserService userServiceClient() { JaxWsProxyFactoryBean factory new JaxWsProxyFactoryBean(); factory.setServiceClass(UserService.class); factory.setAddress(http://localhost:8080/ws/UserService); factory.setUsername(admin); factory.setPassword(password); return (UserService) factory.create(); } }setServiceClass这里传的是接口的Class对象。注意客户端和服务端的接口必须一致包括包名、方法签名、注解。如果两边接口不一样调用时会报ClassCastException或者NoSuchMethodException。setAddress服务端的完整地址不带?wsdl。这个地址必须能访问到否则创建代理时就会报连接超时。超时设置默认的超时时间可能不够特别是跨网络调用时。可以通过以下方式设置factory.getOutInterceptors().add(new LoggingOutInterceptor()); factory.getInInterceptors().add(new LoggingInInterceptor()); HTTPConduit conduit (HTTPConduit) factory.getClientFactoryBean() .getClient().getConduit(); HTTPClientPolicy policy new HTTPClientPolicy(); policy.setConnectionTimeout(10000); policy.setReceiveTimeout(30000); conduit.setClientPolicy(policy);连接超时设10秒读取超时设30秒这是我实测下来比较合理的值。如果对方服务响应慢读取超时可以再调大。4.2 代码生成方式最规范CXF提供了wsdl2java工具可以根据WSDL生成客户端代码。这种方式适合接口稳定的场景wsdl2java -d src/main/java -p com.example.client http://localhost:8080/ws/UserService?wsdl生成的代码包括接口、实现类、异常类等。调用时直接new一个Service类然后getPort()UserServiceService service new UserServiceService(); UserService port service.getUserServicePort(); UserInfo info port.getUserInfo(123);这种方式的好处是类型安全编译期就能发现接口不匹配的问题。缺点是WSDL一变就得重新生成而且生成的代码风格不太符合现代Java规范。4.3 三种调用方式对比方式灵活性类型安全维护成本适用场景动态代理高低低接口频繁变化、快速验证代码生成低高中接口稳定、长期维护Spring WebServiceTemplate中中中需要精细控制SOAP消息我一般先用动态代理快速验证确认没问题后再考虑要不要换成代码生成。如果项目周期短动态代理就够了。4.4 客户端调用的注意事项接口包名一致性客户端和服务端的接口包名最好一致。如果实在不一致至少保证targetNamespace一致。否则CXF在匹配时会出问题。参数序列化如果参数是复杂对象必须有无参构造函数字段要有getter/setter。JAXB在序列化时会用到这些。我遇到过因为缺少无参构造函数导致序列化失败的情况报错信息很不直观查了很久。日志拦截器调试阶段一定要加上LoggingInInterceptor和LoggingOutInterceptor这样能看到完整的SOAP请求和响应。生产环境记得去掉否则日志量太大。5. 常见问题与排查技巧实录5.1 启动报错Bean定义冲突现象启动时抛出ConflictingBeanDefinitionException提示两个Bean名字相同。原因通常是同时引入了cxf-spring-boot-starter-jaxws和spring-boot-starter-web-services两者都注册了同名的Bean。解决只保留一个starter删掉另一个。如果确实需要两个都用给其中一个的Bean加Primary注解。5.2 WSDL打不开404错误现象访问/ws/UserService?wsdl返回404。排查步骤检查ServletRegistrationBean的路径是否正确是不是/ws/*检查Endpoint的publish路径是不是/UserService检查是否有其他Servlet或Filter拦截了/ws路径查看启动日志确认CXF有没有发布服务最常见的原因是路径冲突比如Spring MVC的DispatcherServlet映射了/把/ws也拦截了。解决办法是在DispatcherServlet的映射里排除/ws/*或者把CXF的Servlet路径改成一个不冲突的。5.3 调用超时Read timed out现象客户端调用时抛出SocketTimeoutException。原因默认超时时间太短或者服务端处理时间过长。解决按前面说的方式设置HTTPClientPolicy的connectionTimeout和receiveTimeout。如果服务端确实处理慢考虑异步调用或者优化服务端逻辑。5.4 参数为nullJAXB序列化问题现象客户端传了参数服务端收到的是null。原因通常是参数名不匹配。客户端生成的SOAP消息里参数标签是arg0服务端期望的是userId。解决确保接口上的WebParam注解设置了name属性客户端和服务端保持一致。如果是代码生成方式重新生成客户端代码。5.5 中文乱码编码问题现象传输中文时出现乱码。原因SOAP消息的编码不是UTF-8。解决在CXF的配置里设置编码factory.getOutInterceptors().add(new LoggingOutInterceptor()); // 设置编码 MapString, Object props new HashMap(); props.put(javax.xml.soap.characterEncoding, UTF-8);或者在服务端配置endpoint.getProperties().put(javax.xml.soap.characterEncoding, UTF-8);5.6 常见问题速查表问题可能原因排查方法解决方案启动报Bean冲突依赖冲突查看异常堆栈删除多余starterWSDL 404路径配置错误检查Servlet和Endpoint路径调整路径或排除冲突调用超时超时设置过短查看异常类型增大超时时间参数为null参数名不匹配抓包看SOAP消息统一WebParam的name中文乱码编码不一致查看消息头设置UTF-8编码类转换异常接口不一致对比两边接口保持接口完全一致5.7 独家避坑技巧技巧一先用SoapUI验证服务端。服务端搭好后别急着写客户端代码先用SoapUI导入WSDL手动调一下。这样能快速确认服务端没问题把问题范围缩小到客户端。技巧二日志级别调到DEBUG。CXF的日志很详细DEBUG级别能看到完整的SOAP消息。在application.yml里加logging: level: org.apache.cxf: DEBUG技巧三接口先定稿再开发。WebService的接口一旦发布改起来成本很高。建议先把WSDL定稿双方确认后再各自开发。我吃过这个亏接口改了三次客户端代码生成了三次浪费了大量时间。技巧四版本号写进namespace。比如http://service.example.com/v1/这样以后接口升级可以发布v2版本老客户端不受影响。6. 生产环境部署的几点经验6.1 性能调优参数生产环境的并发量上来后默认配置可能扛不住。我一般会调整这几个参数server: tomcat: max-threads: 200 accept-count: 100 max-connections: 10000CXF这边可以设置线程池factory.getOutInterceptors().add(new LoggingOutInterceptor()); // 设置线程池 ExecutorService executor Executors.newFixedThreadPool(50); factory.setExecutor(executor);线程池大小根据实际并发量调整一般设为最大并发数的1.5倍。6.2 安全加固WebService的安全主要靠WS-Security但配置比较复杂。如果只是内网调用可以用简单认证factory.setUsername(admin); factory.setPassword(password);服务端验证Bean public Endpoint endpoint(UserService userService) { EndpointImpl endpoint new EndpointImpl(springBus(), userService); endpoint.publish(/UserService); MapString, Object props new HashMap(); props.put(ws-security.username, admin); props.put(ws-security.password, password); endpoint.setProperties(props); return endpoint; }注意这种方式只是简单认证安全性有限。如果对外网暴露建议用WS-Security或者加HTTPS。6.3 监控与日志生产环境要监控服务的调用量、响应时间、错误率。CXF提供了JMX支持可以集成到监控系统里。日志方面建议只记录错误和慢调用不要记录所有请求否则日志文件会爆炸。我一般会加一个自定义的Interceptor记录超过1秒的调用public class PerformanceInterceptor extends AbstractPhaseInterceptorMessage { public PerformanceInterceptor() { super(Phase.RECEIVE); } Override public void handleMessage(Message message) throws Fault { long startTime System.currentTimeMillis(); // 记录开始时间 message.getExchange().put(startTime, startTime); } }然后在发送响应时计算耗时超过阈值就记日志。7. 后续扩展方向这套方案跑通之后还可以往几个方向扩展。一个是集成WS-Security实现更安全的认证和加密另一个是支持异步调用提高吞吐量还有就是做服务治理把WebService接口注册到服务注册中心统一管理。我个人觉得如果项目里WebService接口不多没必要搞太复杂。把基本的服务端和客户端跑通加上必要的日志和监控就够用了。过度设计反而增加维护成本。最后分享一个小技巧如果对方的WSDL文件很大用wsdl2java生成代码时可能会很慢。可以先把WSDL下载到本地然后用本地文件路径生成速度会快很多。命令是wsdl2java -d src/main/java -p com.example.client /path/to/local.wsdl这个技巧在处理大型企业级WSDL时特别有用我试过用远程地址生成要等好几分钟用本地文件几秒钟就搞定了。

相关新闻

给Claude装上长期记忆:claude-mem配置实战与踩坑指南

给Claude装上长期记忆:claude-mem配置实战与踩坑指南

上个月我做一个跨平台工具的原型设计,同一份背景说明,我在Claude里前前后后贴了不下十遍。每次新开一个会话,它都像第一天认识这个项目一样,问我一些我早就回答过的问题。这其实不是Claude的问题,而是对话式AI默认没有…

2026/10/13 12:12:52 阅读更多 →
AI芯片软硬件协同设计:从架构到编译器的工程实践与避坑指南

AI芯片软硬件协同设计:从架构到编译器的工程实践与避坑指南

1. AI芯片软硬件协同设计的整体思路拆解1.1 为什么AI芯片不能只谈硬件很多人第一次接触AI芯片,脑子里想的都是算力、TOPS、制程这些硬指标,觉得只要把MAC阵列堆得足够大、把频率拉得足够高,性能自然就上去了。我刚开始也是这么想的&#xff0…

2026/10/13 12:12:14 阅读更多 →
不写一行JS也能惊艳?5个原生HTML Demo展示HTML5魅力

不写一行JS也能惊艳?5个原生HTML Demo展示HTML5魅力

1. 别把HTML当“过气的标记语言”来看做前端这些年,我发现一个很有意思的现象:很多新入行的同学觉得HTML太简单,不就是几个标签拼一拼吗?而一些资深开发又容易把它当成“理所当然的存在”,写代码时脑海里全是JS逻辑和框…

2026/10/13 12:12:19 阅读更多 →

最新新闻

利用阿里云alidns实现DDNS动态解析:公网IP变化自动更新教程

利用阿里云alidns实现DDNS动态解析:公网IP变化自动更新教程

家里的宽带每隔一段时间公网IP就会变,尤其是不满运营商最长在线时长之后强制断线重拨的那种,老域名解析记录一直是旧IP,访问家里NAS或者是远程桌面全都得靠临时记IP来连,烦得不行。后来我把域名托管到了阿里云云解析,直…

2026/10/13 22:17:56 阅读更多 →
电子签章选型必读:法律效力、防篡改与集成的6个关键点

电子签章选型必读:法律效力、防篡改与集成的6个关键点

很多企业在做流程线上化的时候,最容易忽略的一环就是“最后签字盖章怎么弄”。等合同审批流程都跑通了,业务部门拿着实体章站在打印机旁边,才发现线上化根本没有真正闭环。这两年电子签章已经是很多公司的刚需选项,但选型负责人对…

2026/10/13 22:17:56 阅读更多 →
论文摘要与结论的AI急救:3分钟结构化提炼实战指南

论文摘要与结论的AI急救:3分钟结构化提炼实战指南

论文写得七七八八,结果卡在摘要和结论上干瞪眼,这事儿我太熟了。数据显示,超过六成的作者在投稿前最后一晚还在改摘要——不是因为写得不好,而是压根不知道摘要该写什么、结论收在哪。审稿人最先看的就是这两块,但很多…

2026/10/13 22:17:56 阅读更多 →
C++与OpenCV实现虹膜分割:从霍夫圆检测到掩膜生成与参数调优

C++与OpenCV实现虹膜分割:从霍夫圆检测到掩膜生成与参数调优

简介:这份资源聚焦虹膜分割与虹膜提取的工程实现,面向具备一定图像处理基础、希望用C与OpenCV落地生物特征识别项目的开发者与学习者。包内提供可直接编译运行的Visual Studio工程,核心代码以cpp源文件形式给出,并配有测试图片与一…

2026/10/13 22:17:56 阅读更多 →
近视调节力训练与保护全攻略

近视调节力训练与保护全攻略

1. 近视困扰的本质解析近视人群的日常困扰远比视力表上的数字复杂得多。早晨醒来第一件事摸眼镜,吃火锅时镜片起雾,运动时框架不断下滑,这些生活细节构成了近视者的共同记忆。但大多数人不知道的是,除了眼轴长度这个硬指标外&…

2026/10/13 22:17:56 阅读更多 →
Agent技能工程:可测试、可编排、可治理的智能体落地实践

Agent技能工程:可测试、可编排、可治理的智能体落地实践

1. “agent-skills”不是新词,而是智能体工程落地的临界信号最近在几个技术社区和内部项目复盘会上,反复看到“agent-skills”这个组合被开发者随手写在白板角落、贴在PR描述里,甚至出现在某高校AI课程实验手册的标题栏——但它既不是某个开源…

2026/10/13 22:16:55 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →