You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring集成Google Vision Api时遇java.lang.VerifyError及404问题求助

解决Spring环境下Google Vision API的VerifyError与404问题

看起来你遇到了两个关联的问题:Spring环境下的java.lang.VerifyError,以及添加Bean配置后的页面404。让我们一步步拆解解决:

一、先解决java.lang.VerifyError

这个错误本质是JVM验证字节码时发现异常,通常和依赖冲突、类加载差异或版本不兼容有关,结合你的场景,可能的原因和修复方案:

1. 排查依赖冲突

Google Vision API依赖的库(比如Guava、Google API客户端)很容易和Spring自带的库版本冲突。执行以下步骤:

  • 用mvn dependency:tree(Maven)或./gradlew dependencies(Gradle)生成依赖树,查找重复或版本不一致的依赖(比如guava、google-api-client)。
  • 排除Spring依赖中冲突的模块,比如在Maven的pom.xml中添加排除:
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>你的Spring版本</version>
    <exclusions>
        <exclusion>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 确保google-cloud-vision的版本和Spring版本兼容,建议使用最新稳定版的Google Cloud库。

2. 调整Spring类加载策略

Spring的类加载器和普通Java应用不同,可能导致类重复加载。可以尝试:

  • 避免在Labels类的静态初始化块或构造函数中提前加载Vision服务类,改为由Spring容器管理实例化。
  • 如果是Web应用,可在Tomcat配置中调整类加载顺序,让Google相关类优先由系统类加载器加载。

3. 确认凭证加载的正确性

虽然你用了系统级JSON凭证,但Spring环境下需要确保凭证加载时机正确:

  • 不要在Labels构造函数中直接初始化VisionService,而是通过Spring注入已初始化的ImageAnnotatorClient(VisionService的实现类)。

二、解决添加Bean后的404页面问题

这个问题大概率是Spring容器初始化失败导致的,因为你的Bean配置存在明显的问题:

1. 你的Bean配置的核心问题

你的Labels类构造函数需要VisionService参数,但XML中没有注入这个依赖,而是直接设置了字段(如果APPLICATION_NAME是静态字段,Spring的<property>配置还会无效)。Spring无法实例化缺少构造参数的Bean,会导致容器启动失败,进而所有请求返回404。

2. 正确的Bean配置方式

先配置ImageAnnotatorClient(即VisionService)的Bean,再注入到Labels中:

<!-- 1. 配置Google Vision客户端,加载凭证 -->
<bean id="visionClient" class="com.google.cloud.vision.v1.ImageAnnotatorClient" factory-method="create">
    <constructor-arg>
        <bean class="com.google.cloud.vision.v1.ImageAnnotatorSettings" factory-method="newBuilder">
            <property name="credentialsProvider">
                <bean class="com.google.api.gax.core.FixedCredentialsProvider">
                    <constructor-arg>
                        <bean class="com.google.auth.oauth2.GoogleCredentials" factory-method="fromStream">
                            <!-- 加载类路径下的凭证文件 -->
                            <constructor-arg>
                                <bean class="org.springframework.core.io.ClassPathResource">
                                    <constructor-arg value="service-account.json" />
                                </bean>
                            </constructor-arg>
                        </bean>
                    </constructor-arg>
                </bean>
            </property>
        </bean>
    </constructor-arg>
</bean>

<!-- 2. 配置Labels Bean,注入Vision客户端 -->
<bean id="googleVisionApiAuthenticator" class="com.something.mypackage.Labels">
    <!-- 传入构造参数:VisionService实例 -->
    <constructor-arg ref="visionClient" />
    <!-- 如果APPLICATION_NAME是实例字段,直接设置;如果是静态字段,需添加静态setter方法 -->
    <property name="applicationName" value="myCompany-VisionLabelSample/1.0" />
    <property name="maxLabels" value="3" />
</bean>

注意:如果APPLICATION_NAME是静态字段,Spring的<property>无法直接设置,建议修改Labels类将其改为实例字段,或添加静态setter方法配合Spring的方法注入。

3. 检查Spring启动日志

查看Tomcat或Spring的启动日志,确认是否有Bean初始化异常。如果容器启动失败,日志中会明确指出哪个Bean出了问题,这是快速定位404的关键。


三、额外建议

  • 尽量使用Spring Boot的自动配置来整合Google Cloud服务,比XML配置更简洁,也能减少依赖冲突。
  • 确保Labels类的构造函数和字段访问权限正确(比如构造函数是public的,实例字段有对应的setter方法)。
  • 测试时先单独启动Spring容器,验证Bean是否能正常初始化,再测试Vision API的调用逻辑。

内容的提问来源于stack exchange,提问作者Manali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:20:28