需求环境

ORC识别图片信息 参考百度示例

百度智能云API文档通用文字识别

官方示例

package baidu.com;

import okhttp3.*;
import org.json.JSONObject;

import java.io.*;

/**
 * 需要添加依赖
 * <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
 * <dependency>
 *     <groupId>com.squareup.okhttp3</groupId>
 *     <artifactId>okhttp</artifactId>
 *     <version>4.12.0</version>
 * </dependency>
 */

class Sample {
    public static final String API_KEY = "7bfV7EunI2ZjzcSLGdC59wht";
    public static final String SECRET_KEY = "uKZNGVepDBhhUmxwcu53M5e2CpifUb4p";

    static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();

    public static void main(String []args) throws IOException{
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
        RequestBody body = RequestBody.create(mediaType, "");
        Request request = new Request.Builder()
            .url("https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=" + getAccessToken())
            .method("POST", body)
            .addHeader("Content-Type", "application/x-www-form-urlencoded")
            .addHeader("Accept", "application/json")
            .build();
        Response response = HTTP_CLIENT.newCall(request).execute();
        System.out.println(response.body().string());

    }
    
    
    /**
     * 从用户的AK,SK生成鉴权签名(Access Token)
     *
     * @return 鉴权签名(Access Token)
     * @throws IOException IO异常
     */
    static String getAccessToken() throws IOException {
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
        RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY
                + "&client_secret=" + SECRET_KEY);
        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/oauth/2.0/token")
                .method("POST", body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .build();
        Response response = HTTP_CLIENT.newCall(request).execute();
        return new JSONObject(response.body().string()).getString("access_token");
    }
}

异常信息

项目引入okhttp-4.12.0.jar 包后,还需引入okio-1.12.0.jar 配置完后测试出现下方异常

Exception in thread "main" java.lang.NoSuchFieldError: Companion
	at okhttp3.internal.Util.<clinit>(Util.kt:70)
	at okhttp3.OkHttpClient.<clinit>(OkHttpClient.kt:1073)
	at com.yc.strayanimals.baidu.Sample.<clinit>(Sample.java:26)

百度智能云通用文字识别(标准版)- java.lang.NoSuchFieldError: Companion-LMLPHP

官网在线调试正常响应,怀疑SDK包引用冲突 即okio.jar 的版本不匹配

报错解释

java.lang.NoSuchFieldError: Companion 错误通常发生在Java环境中,当程序尝试访问一个类中不存在的字段时会抛出。在Kotlin语言中,Companion是一个关键字,用于定义一个伴生对象。如果你的代码中出现这个错误,可能是因为:

  • 编译的类路径不一致:你可能在运行时使用了一个与编译时不同的类版本,其中不包含Companion字段。
  • 依赖冲突:项目中可能包含有不同版本的依赖库,导致运行时类路径上的类与编译时使用的类不匹配。

解决思路

  • 确保所有的类都是最新编译的,并且运行时的类路径与编译时一致。

  • 检查项目的依赖管理文件(如pom.xml或build.gradle),确保没有版本冲突,并且所有的依赖都是最新的或者是兼容的版本。

  • 如果使用了构建工具(如Maven或Gradle),尝试清理并重新构建项目。

  • 如果在使用IDE,尝试清理并重新导入项目。

  • 如果问题依然存在,检查是否有旧版本的类文件残留在环境中,如果有,删除它们。

根本原因

com.squareup包下的okio.jarokhttp3版本不兼容

解决办法

1、和冲突的包换个位置,用高版本的okio包即可

2、或者添加依赖冲突的sdk的时候排除指定包即可

完美处理

okio.jar版本切换成2.4.3 测试成功

参考博主

Maven方案可参考博主

08-22 07:37