Eclipse报错:Cannot instantiate the type JsonFactory(Google登录Servlet开发)
问题描述
我正在开发一个需要Google登录的项目,使用Servlet实现用户认证,在Servlet中遇到错误:Cannot instantiate the type JsonFactory。以下是我的代码:
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken; import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; public class IdTokenVerifierAndParser { private static final String GOOGLE_CLIENT_ID = "_id_"; public static GoogleIdToken.Payload getPayload (String tokenString) throws Exception { JsonFactory jacksonFactory = new JsonFactory(); GoogleIdTokenVerifier googleIdTokenVerifier = new GoogleIdTokenVerifier(new NetHttpTransport(), jacksonFactory); GoogleIdToken token = GoogleIdToken.parse(jacksonFactory, tokenString); if (googleIdTokenVerifier.verify(token)) { GoogleIdToken.Payload payload = token.getPayload(); if (!GOOGLE_CLIENT_ID.equals(payload.getAudience())) { throw new IllegalArgumentException("Audience mismatch"); } else if (!GOOGLE_CLIENT_ID.equals(payload.getAuthorizedParty())) { throw new IllegalArgumentException("Client ID mismatch"); } return payload; } else { throw new IllegalArgumentException("id token cannot be verified"); } } }
解决方案
问题根源
JsonFactory是抽象类,Java中抽象类无法直接通过new关键字实例化,必须使用它的具体实现类。Google API客户端提供了Jackson和Gson两种常用的JSON实现方案。
步骤1:添加对应依赖
根据你选择的JSON库,添加Maven依赖(Gradle用户可自行调整配置):
- 若使用Jackson:
<dependency> <groupId>com.google.api-client</groupId> <artifactId>google-api-client-jackson2</artifactId> <version>1.42.0</version> <!-- 建议使用最新稳定版本 --> </dependency>
- 若使用Gson:
<dependency> <groupId>com.google.api-client</groupId> <artifactId>google-api-client-gson</artifactId> <version>1.42.0</version> </dependency>
步骤2:修改代码实例化方式
替换代码中JsonFactory jacksonFactory = new JsonFactory();这一行:
- Jackson版本:
// 先导入JacksonFactory import com.google.api.client.json.jackson2.JacksonFactory; // 实例化 JsonFactory jacksonFactory = JacksonFactory.getDefaultInstance();
- Gson版本:
// 先导入GsonFactory import com.google.api.client.json.gson.GsonFactory; // 实例化 JsonFactory gsonFactory = GsonFactory.getDefaultInstance();
修复后的完整代码(Jackson版本)
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken; import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson2.JacksonFactory; public class IdTokenVerifierAndParser { private static final String GOOGLE_CLIENT_ID = "_id_"; public static GoogleIdToken.Payload getPayload(String tokenString) throws Exception { JsonFactory jacksonFactory = JacksonFactory.getDefaultInstance(); GoogleIdTokenVerifier googleIdTokenVerifier = new GoogleIdTokenVerifier(new NetHttpTransport(), jacksonFactory); GoogleIdToken token = GoogleIdToken.parse(jacksonFactory, tokenString); if (googleIdTokenVerifier.verify(token)) { GoogleIdToken.Payload payload = token.getPayload(); if (!GOOGLE_CLIENT_ID.equals(payload.getAudience())) { throw new IllegalArgumentException("Audience mismatch"); } else if (!GOOGLE_CLIENT_ID.equals(payload.getAuthorizedParty())) { throw new IllegalArgumentException("Client ID mismatch"); } return payload; } else { throw new IllegalArgumentException("id token cannot be verified"); } } }
内容的提问来源于stack exchange,提问作者Belle
相关产品推荐
相关产品推荐

