在Jakarta EE Rest Web应用中使用langchain4j OpenAI API崩溃的原因?
问题解决:Jakarta EE中langchain4j调用OpenAI API因sun.misc.Unsafe限制崩溃
问题根源
你推测的结论正确:Jakarta EE容器(如你使用的WildFly)出于安全与规范要求,禁止应用直接访问sun.misc.Unsafe API。而langchain4j依赖的openai4j库默认使用GSON,GSON会尝试通过Unsafe实例化无默认构造函数的ChatCompletionResponse类,触发容器的权限限制导致崩溃。
解决方案
方案1:自定义GSON配置禁用Unsafe
手动创建禁用Unsafe的Gson实例,替换OpenAiChatModel默认的JSON处理器,让GSON改用反射实例化对象:
@Path("blockChat") public class BlockChat { private OpenAiChatModel chatModel; public BlockChat(){ String apiKey = "XXXXXXXXX"; // 创建禁用Unsafe的Gson实例 Gson gson = new GsonBuilder() .disableJdkUnsafe() .create(); // 自定义OpenAiClient并传入配置好的Gson OpenAiClient openAiClient = OpenAiClient.builder() .apiKey(apiKey) .gson(gson) .build(); chatModel = OpenAiChatModel.builder() .openAiClient(openAiClient) .build(); } @GET @Produces(MediaType.TEXT_PLAIN) @Path("/{message}") public String chat(@PathParam("message") String message) { return chatModel.generate(message); } }
方案2:升级langchain4j版本
langchain4j后续版本(如0.35.0及以上)已调整JSON处理逻辑,部分版本切换为Jackson作为默认处理器,避免了对Unsafe的依赖。修改pom.xml中的依赖版本:
<dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-open-ai</artifactId> <version>0.35.0</version> <!-- 或更高稳定版本 --> </dependency>
方案3:(不推荐)在WildFly中开放Unsafe访问
仅作为临时测试方案,修改WildFly的standalone-full.xml配置,添加JVM参数开放Unsafe权限:
<jvm-options> <!-- 其他原有参数 --> <jvm-option>-XX:+UnlockDiagnosticVMOptions</jvm-option> <jvm-option>-XX:+UnsafeDebugging</jvm-option> <jvm-option>--add-opens=java.base/sun.misc=ALL-UNNAMED</jvm-option> </jvm-options>
该方式违反Jakarta EE规范,降低应用安全性与可移植性,不建议生产环境使用。
验证
修改代码或配置后,重新构建并部署到WildFly,发送GET请求测试端点是否正常返回响应。
内容的提问来源于stack exchange,提问作者Jâwâhar Babu
相关产品推荐
相关产品推荐

