Exception in thread "main" java.lang.NoSuchMethodError: com.aliyun.credentials.Client.getCredential()Lcom/aliyun/credentials/models/CredentialModel;at com.aliyun.teaopenapi.Client.doRequest(Client.java:812)at com.aliyun.teaopenapi.Client.callApi(Client.java:1080)at com.aliyun.openplatform20191219.Client.authorizeFileUploadWithOptions(Client.java:46)at com.aliyun.ocr20191230.Client.recognizeLicensePlateAdvance(Client.java:770)at com.utils.RecognizeLicensePlateAli.main(RecognizeLicensePlateAli.java:59)
其实解决bug很简单,是缺了个包,而且这个是运行时异常
<dependency><groupId>com.aliyun</groupId><artifactId>tea-openapi</artifactId><version>0.2.1</version></dependency><!-- 还有这个识别用的包 --><dependency><groupId>com.aliyun</groupId><artifactId>ocr20191230</artifactId><version>2.0.1</version></dependency>
package com.utils;/*
引入依赖包
<!-- https://mvnrepository.com/artifact/com.aliyun/ocr20191230 -->
<dependency><groupId>com.aliyun</groupId><artifactId>ocr20191230</artifactId><version>${aliyun.ocr.version}</version>
</dependency>
*/import cn.hutool.core.collection.CollUtil;
import com.aliyun.ocr20191230.models.RecognizeLicensePlateResponse;
import com.aliyun.ocr20191230.models.RecognizeLicensePlateResponseBody;
import com.aliyun.tea.TeaException;
import org.springframework.web.bind.annotation.GetMapping;import java.io.File;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.List;
import java.util.Optional;public class RecognizeLicensePlateAli {public static String accessKeyId = "ABC123456";public static String accessKeySecret = "ABC123456";public static com.aliyun.ocr20191230.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {/*初始化配置对象com.aliyun.teaopenapi.models.ConfigConfig对象存放 AccessKeyId、AccessKeySecret、endpoint等配置*/com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config().setAccessKeyId(accessKeyId).setAccessKeySecret(accessKeySecret);// 访问的域名config.endpoint = "ocr.cn-shanghai.aliyuncs.com";return new com.aliyun.ocr20191230.Client(config);}public String licensePlate(String filePath) throws Exception {com.aliyun.ocr20191230.Client client = RecognizeLicensePlateAli.createClient(accessKeyId, accessKeySecret);File file = new File(filePath);// 创建InputStreamInputStream inputStream = Files.newInputStream(file.toPath());com.aliyun.ocr20191230.models.RecognizeLicensePlateAdvanceRequest recognizeLicensePlateAdvanceRequest = new com.aliyun.ocr20191230.models.RecognizeLicensePlateAdvanceRequest().setImageURLObject(inputStream);com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();try {RecognizeLicensePlateResponse response = client.recognizeLicensePlateAdvance(recognizeLicensePlateAdvanceRequest, runtime);List<RecognizeLicensePlateResponseBody.RecognizeLicensePlateResponseBodyDataPlates> recognizeLicensePlateResponseBodyDataPlates = Optional.of(response).map(RecognizeLicensePlateResponse::getBody).map(RecognizeLicensePlateResponseBody::getData).map(RecognizeLicensePlateResponseBody.RecognizeLicensePlateResponseBodyData::getPlates).orElse(null);if (CollUtil.isNotEmpty(recognizeLicensePlateResponseBodyDataPlates)) {RecognizeLicensePlateResponseBody.RecognizeLicensePlateResponseBodyDataPlates data = recognizeLicensePlateResponseBodyDataPlates.get(0);String plateNumber = data.getPlateNumber();System.out.println(plateNumber);}} catch (TeaException error) {// 获取整体报错信息System.out.println(com.aliyun.teautil.Common.toJSONString(error));// 获取单个字段System.out.println(error.getCode());}return "";}public static void main(String[] args) throws Exception {// 创建AccessKey ID和AccessKey Secret,请参见:https://help.aliyun.com/document_detail/175144.html// 如果您使用的是RAM用户的AccessKey,还需要为子账号授予权限AliyunVIAPIFullAccess,请参见:https://help.aliyun.com/document_detail/145025.html// 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行代码示例前必须先配置环境变量。
// String accessKeyId = System.getenv("LTAI5t6ija1dt5E5vPh4nnDX");
// String accessKeySecret = System.getenv("brRgmpD7Ch7NUiIiqKJO7kZC5jJZVA");com.aliyun.ocr20191230.Client client = RecognizeLicensePlateAli.createClient(accessKeyId, accessKeySecret);// 场景一,使用本地文件// InputStream inputStream = new FileInputStream(new File("/tmp/RecognizeLicensePlate1.jpg"));// 场景二,使用任意可访问的url
// URL url = new URL("http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/ocr/RecognizeLicensePlate/cpsb1.jpg");
// InputStream inputStream = url.openConnection().getInputStream();File file = new File("C:\\Users\\Administrator\\Desktop\\123.jpg");// 创建InputStreamInputStream inputStream = Files.newInputStream(file.toPath());com.aliyun.ocr20191230.models.RecognizeLicensePlateAdvanceRequest recognizeLicensePlateAdvanceRequest = new com.aliyun.ocr20191230.models.RecognizeLicensePlateAdvanceRequest().setImageURLObject(inputStream);com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();try {// 复制代码运行请自行打印 API 的返回值RecognizeLicensePlateResponse response = client.recognizeLicensePlateAdvance(recognizeLicensePlateAdvanceRequest, runtime);List<RecognizeLicensePlateResponseBody.RecognizeLicensePlateResponseBodyDataPlates> recognizeLicensePlateResponseBodyDataPlates = Optional.of(response).map(RecognizeLicensePlateResponse::getBody).map(RecognizeLicensePlateResponseBody::getData).map(RecognizeLicensePlateResponseBody.RecognizeLicensePlateResponseBodyData::getPlates).orElse(null);if (CollUtil.isNotEmpty(recognizeLicensePlateResponseBodyDataPlates)) {RecognizeLicensePlateResponseBody.RecognizeLicensePlateResponseBodyDataPlates data = recognizeLicensePlateResponseBodyDataPlates.get(0);String plateNumber = data.getPlateNumber();System.out.println(plateNumber);}} catch (TeaException error) {// 获取整体报错信息System.out.println(com.aliyun.teautil.Common.toJSONString(error));// 获取单个字段System.out.println(error.getCode());}}
}