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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:36:18