LangChain4j有一个核心的设计模式是AI Service,但是最近学习的时候总是有一个测试类测试失败:

package com.wc.langchain4j.service;

import com.wc.langchain4j.LangChain4jApplication;
import com.wc.langchain4j.factory.AiCodeHelperServiceFactory;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.ContextConfiguration;

@SpringBootTest

public class AiCodeHelperServiceTest {

    @Autowired
    private AiCodeHelperService aiCodeHelperService;

    @Test
    void chat(){

        if (aiCodeHelperService == null) {
            System.err.println("AiCodeHelperService is null!");
            return;
        }

        String result = aiCodeHelperService.chat("你好");

        System.out.println(result);
    }
}

一直测试说是没有对应的bean,不可以注入空的依赖对象

java.lang.IllegalArgumentException: invocationContext cannot be null

就是这个问题控了我一天时间哈哈哈哈💦

问题就是Service类的工厂类没给Service类创造实例

service:负责业务接口定义

package com.wc.langchain4j.service;

import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;

public interface AiCodeHelperService {

    @SystemMessage("你是一位编程小助手")
    String chat(@UserMessage String userMessage);
}

Factory:负责给Service具体依赖注入,算是实现这个接口

package com.wc.langchain4j.factory;

import com.wc.langchain4j.service.AiCodeHelperService;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.service.AiServices;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AiCodeHelperServiceFactory {

    @Resource
    private ChatModel deepseekChatModel;
    @Bean
    public AiCodeHelperService aiCodeHelperService() {

        return AiServices.builder(AiCodeHelperService.class).chatModel(deepseekChatModel).build();
    }
}

其中这个builder会创建一个model实体实现接口的代理对象

前面的报错导致我反反复复检查了 好几遍工厂类和Service,还有测试类,以为是测试类没有扫描到工厂类还手动导入了,又以为是工厂的注入bean名称有问题,手动指定bean名称

后面一直没招了,终于找到pom依赖上去了,尝试更新了一下依赖版本,

然后测试,

居然可以了!!!!!!!!!!!!!!!!!

    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j</artifactId>
        <version>1.11.0</version>
    </dependency>

之前我一直用的是1.1.0的版本

shift!!!!!!!!!!又是依赖!!!!!!!!!!!

总之bean注入又问题,invoke为null的情况,不一定是配置bean有问题,有时候说不定是依赖版本太低不支持工厂的注入方法呢

💦💦,总算搞定了嗨嗨嗨

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐