当前位置: 首页 > 知识库问答 >
问题:

原因:java.lang.安全异常:无法使字段构造函数可访问

上官培
2023-03-14

我在保存数据时遇到了ActiveAndroid问题。

import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
import com.google.gson.annotations.SerializedName;

@Table(name = "login_response")
public class LoginResponse extends Model{
    @Column(name = "a_token")
    @SerializedName("access_token")
    public String mAccessToken;

    @Column(name = "expiry_time")
    @SerializedName("expires_in")
    public Long mExpiresIn;

    @Column(name = "refresh_token")
    @SerializedName("refresh_token")
    public String mRefreshToken;


    @Column(name = "scope")
    @SerializedName("scope")
    public String mScope;

    @Column(name = "token_type")
    @SerializedName("token_type")
    public String mTokenType;

    public LoginResponse(){}

    public String getAccessToken() {
        return mAccessToken;
    }

    public void setAccessToken(String accessToken) {
        mAccessToken = accessToken;
    }

    public Long getExpiresIn() {
        return mExpiresIn;
    }

    public void setExpiresIn(Long expiresIn) {
        mExpiresIn = expiresIn;
    }

    public String getRefreshToken() {
        return mRefreshToken;
    }

    public void setRefreshToken(String refreshToken) {
        mRefreshToken = refreshToken;
    }

    public String getScope() {
        return mScope;
    }

    public void setScope(String scope) {
        mScope = scope;
    }

    public String getTokenType() {
        return mTokenType;
    }

    public void setTokenType(String tokenType) {
        mTokenType = tokenType;
    }
}

上面是从web api获取数据时使用改装获得的响应的映射类。但我犯了这样的错误。

致命异常:主进程:com。比蒂。在线支付,PID:3826 java。lang.IllegalArgumentException:无法为类com创建转换器。比蒂。在线支付。模型登录。LoginResponse方法LoginApi。获取第二次响应。ServiceMethod$Builder。更新2时出现methodError(ServiceMethod.java:695)。ServiceMethod$Builder。createResponseConverter(ServiceMethod.java:681)位于第2页。ServiceMethod$Builder。在第2页构建(ServiceMethod.java:166)。改造。loadServiceMethod(Refundation.java:166)位于Refundation2。翻新1美元。在java上调用(reformation.java:145)。朗,反思一下。代理调用(Proxy.java:393),价格为$Proxy2。getResponse(未知来源)位于com。比蒂。在线支付。用户界面。viewpresenter。登录。登录PresentImpl。在com上尝试登录(loginpresentrempl.java:39)。比蒂。在线支付。用户界面。viewpresenter。登录。登录注册活动。onbtnsigninclick(LoginRegisterActivity.java:93)位于com。比蒂。在线支付。用户界面。viewpresenter。登录。LoginRegisterActivity$$ViewBinder$1。butterknife的doClick(LoginRegisterActivity$$ViewBinder.java:23)。内部的DebouncingOnClickListener。android上的onClick(DebouncingOnClickListener.java:22)。看法看法android上的performClick(View.java:5198)。看法查看$PerformClick。在android上运行(View.java:21147)。操作系统。汉德勒。android上的handleCallback(Handler.java:739)。操作系统。汉德勒。android上的dispatchMessage(Handler.java:95)。操作系统。活套。android上的loop(Looper.java:148)。应用程序。活动线程。java上的main(ActivityThread.java:5417)。朗,反思一下。方法在com上调用(本机方法)。Android内部的操作系统。ZygoteInit$MethodandArgscaler。在com上运行(zyteinit.java:726)。Android内部的操作系统。合子体。main(zyteinit.java:616)由以下原因引起:java。lang.SecurityException:无法在java上访问字段构造函数。朗,反思一下。建造师。setAccessible(Constructor.java:334)位于com.google.格森。内部的施工人员施工人员。com上的newDefaultConstructor(ConstructorConstructor.java:101)。谷歌。格森。内部的施工人员施工人员。在com上获取(ConstructorConstructor.java:83)。谷歌。格森。内部的绑定ReflectTypeAdapterFactory。在com上创建(reflectTypeAdapterFactory.java:95)。谷歌。格森。格森。getAdapter(Gson.java:416)位于com.google.格森。内部的绑定MapTypeAdapterFactory。getKeyAdapter(MapTypeAdapterFactory.java:140)位于com.google.格森。内部的绑定MapTypeAdapterFactory。在com上创建(MapTypeAdapterFactory.java:125)。谷歌。格森。格森。getAdapter(Gson.java:416)位于com.google.格森。内部的绑定ReflectTypeAdapterFactory。getFieldAdapter(ReflectTypeAdapterFactory.java:135)位于com.google.格森。内部的绑定ReflectTypeAdapterFactory 1美元。(ReflectTypeAdapterFactory.java:105)在com上。谷歌。格森。内部的绑定ReflectTypeAdapterFactory。com上的createBoundField(reflectTypeAdapterFactory.java:104)。谷歌。格森。内部的绑定ReflectTypeAdapterFactory。getBoundFields(ReflectTypeAdapterFactory.java:160)位于com.google.格森。内部的绑定ReflectTypeAdapterFactory。在com上创建(reflectTypeAdapterFactory.java:96)。谷歌。格森。格森。getAdapter(Gson.java:416)位于com.google.格森。内部的绑定ReflectTypeAdapterFactory。getFieldAdapter(ReflectTypeAdapterFactory.java:135)位于com.google.格森。内部的绑定ReflectTypeAdapterFactory 1美元。(ReflectTypeAdapterFactory.java:105)在com上。谷歌。格森。内部的绑定ReflectTypeAdapterFactory。com上的createBoundField(reflectTypeAdapterFactory.java:104)。谷歌。格森。内部的绑定ReflectTypeAdapterFactory。getBoundFields(ReflectTypeAdapterFactory.java:160)位于com.google.格森。内部的绑定ReflectTypeAdapterFactory。在com上创建(reflectTypeAdapterFactory.java:96)。谷歌。格森。格森。getAdapter(Gson.java:416)位于第2页。转换器。格森。GsonConverterFactory。responseBodyConverter(GsonConverterFactory.java:63)位于改造2。改造。nextResponseBodyConverter(Refundation.java:325)位于Refundation2。改造。responseBodyConverter(Reformation.java:308)位于Reformation 2。ServiceMethod$Builder。createResponseConverter(ServiceMethod.java:679)位于第2页。ServiceMethod$Builder。构建(ServiceMethod.java:166)

在使用ActiveAndroid之前,它工作得很好,但当我尝试使用ActiveAndroid时,我遇到了上述错误。我可以将不同类别的手动创建的对象相同并保存下来,但在使用改型和活动android时,我不能。

我正在使用依赖项的改造

编译'com。收拾一下。改装2:改装:2.0.2'

编译'com。收拾一下。改装2:变流器gson:2.0.2'

这就是我构建改造客户端的方式

okhttpClientBuilder = new OkHttpClient.Builder();
        retrofitBuilder = new Retrofit.Builder();

        client = okhttpClientBuilder
                .addInterceptor(new ApiInterceptor())
                .build();

        retrofit = retrofitBuilder
                .baseUrl(BuildConfig.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();

我调用api的方式是

Retrofit retrofit = OnlinePaymentApplication.getRetrofit();
        APIs.LoginApi api = retrofit.create(APIs.LoginApi.class);
        Call<LoginResponse> call = api.getResponse(grantType, clientId, clientSecret, userName, userPassword);
        call.enqueue(new Callback<LoginResponse>() {
            @Override
            public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
                loginView.hideProgress();

                if (response.isSuccessful()) {
                    loginView.onLoginDataReceived(response.body());
                } else {
                    ErrorResponse error = ErrorUtils.parseError(response);
                    loginView.onErrorMessageReceived(error.getMessage());
                }
            }

            @Override
            public void onFailure(Call<LoginResponse> call, Throwable t) {
                loginView.hideProgress();

                if (t instanceof IOException) {
                    loginView.onErrorMessageReceived(MetaData.NETWORK_ERROR);
                } else {
                    loginView.onErrorMessageReceived(t.getLocalizedMessage());
                }

            }
        });

共有1个答案

宋飞文
2023-03-14

您需要指定想要一个版本为2.0.0的Gson转换器,如下所示:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(URL)
    .addConverterFactory(GsonConverterFactory.create())
    .build();
 类似资料:
  • 我的POJO课程如下: 当我试图从我的tst/文件夹创建XYZ类的对象时,它失败了,错误是构造函数不能从外部包访问,但当我在POJO中使用@必需的ArgsConstructor时,它开始正常工作,并且不显示错误。实际错误如下: 错误:XYZ(字符串、字符串、状态)在XYZ中不是公共的;无法从包外部访问 所以,我想知道@AllArgsConstructor(由@Value提供)和@必需ArgsCon

  • 问题内容: 在C ++中,对象的生命周期从构造函数成功完成时开始。在构造函数内部,该对象尚不存在。 问:从构造函数发出异常是什么意思? 答:这意味着构造已失败,该物体从未存在,其寿命从未开始。[ 来源 ] 我的问题是:Java是否同样适用?例如,如果我移交给另一个对象,然后构造函数失败,会发生什么情况? 这个定义明确吗?现在是否有对非对象的引用? 问题答案: 该对象存在,但未正确初始化。 每当构造

  • -----------这是我的文件服务---------------------我使用的是spring boot 2.2.2 -------这是我的文件控制器-------- 进程已完成,退出代码为%1

  • 无法定义“const”构造函数,因为字段“电流用户”使用非常量值初始化。 无法为具有非最终字段的类定义const构造函数。 参数类型'Stream 人飞奔

  • 我有一个以下类: 当我尝试转换JSON时 对于这个类实例,我得到以下异常: 获取原因:com . faster XML . Jackson . databind . jsonmappingexception:无法构造com . medianet . rtb . mogli . commons . dto . ad exchange . floor price data的实例:没有字符串参数构造函数

  • 首先要处理前面已经提到但还没有完全解决的问题。构造函数中发现错误时会发生什么情况? 例如,String 构造函数在 new 失败和无法取得保持 String 的内部表示所需空间时如何响应?问题是构造函数无法返回数值,如何让外部知道对象没有顺利构造呢,一种方案是返回没有正确构造的对象,希望对象使用者通过相应测试确定该对象是不能使用的对象。另一种方案是在构造函数之外设置一些变量。抛出的异常向外部传递失