需求环境
ORC识别图片信息 参考百度示例
官方示例
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)
官网在线调试正常响应,怀疑SDK包引用冲突 即okio.jar
的版本不匹配
报错解释
java.lang.NoSuchFieldError: Companion
错误通常发生在Java环境中,当程序尝试访问一个类中不存在的字段时会抛出。在Kotlin语言中,Companion是一个关键字,用于定义一个伴生对象。如果你的代码中出现这个错误,可能是因为:
- 编译的类路径不一致:你可能在运行时使用了一个与编译时不同的类版本,其中不包含Companion字段。
- 依赖冲突:项目中可能包含有不同版本的依赖库,导致运行时类路径上的类与编译时使用的类不匹配。
解决思路
-
确保所有的类都是最新编译的,并且运行时的类路径与编译时一致。
-
检查项目的依赖管理文件(如pom.xml或build.gradle),确保没有版本冲突,并且所有的依赖都是最新的或者是兼容的版本。
-
如果使用了构建工具(如Maven或Gradle),尝试清理并重新构建项目。
-
如果在使用IDE,尝试清理并重新导入项目。
-
如果问题依然存在,检查是否有旧版本的类文件残留在环境中,如果有,删除它们。
根本原因
com.squareup
包下的okio.jar
与okhttp3
版本不兼容
解决办法
1、和冲突的包换个位置,用高版本的okio包即可
2、或者添加依赖冲突的sdk的时候排除指定包即可
完美处理
okio.jar
版本切换成2.4.3
测试成功