提问人:Ukeme Elijah 提问时间:9/21/2022 最后编辑:Malik SaifullahUkeme Elijah 更新时间:9/22/2022 访问量:504
JSON 对象返回 null 对象引用
json object returning null object reference
问:
我正在使用我用 Java Spring boot 开发的端点来开发一个 Android 应用程序,当我尝试注册用户时,响应一直返回 null。我在 swagger 中使用了相同的端点,它正在工作,但不知道为什么它在 android studio 中不起作用。我不知道为什么它总是返回null。这是来自 logcat 的错误。
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.elijah.ukeme.doctorsappointmentapplication, PID: 18696
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
at com.elijah.ukeme.doctorsappointmentapplication.activities.PatientRegistrationActivity$2.onResponse(PatientRegistrationActivity.java:215)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
这是我的api,我在android studio中将localhost更改为我的系统ip地址localhost:8080/patient/signUp
这些是必需的参数
private String name;
private String email;
private String password;
private String gender;
private String profileImage;
@JsonFormat(shape = JsonFormat.Shape.STRING,pattern = "yyyy-MM-dd")
private LocalDate dateOfBirth;
我的模型类
public class SignUpPatienceDto {
@SerializedName("name")
private String name;
@SerializedName("email")
private String email;
@SerializedName("password")
private String password;
@SerializedName("gender")
private String gender;
@SerializedName("profileImage")
private String profileImage;
@SerializedName("dateOfBirth")
private LocalDate dateOfBirth;
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getProfileImage() {
return profileImage;
}
public void setProfileImage(String profileImage) {
this.profileImage = profileImage;
}
public LocalDate getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(LocalDate dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
public SignUpPatienceDto() {
}
}
基 Url 类
public class BaseUrlClient {
private static final String BASE_URL = "http://192.168.43.5:8080";
private static BaseUrlClient mInstance;
private Retrofit retrofit;
private BaseUrlClient(){
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
public static synchronized BaseUrlClient getInstance(){
if (mInstance ==null){
mInstance = new BaseUrlClient();
}
return mInstance;
}
public ApiClient getApi(){
return retrofit.create(ApiClient.class);
}
}
我的 ApiClient 类
public interface ApiClient {
@POST("/patient/signUp")
Call<ResponseBody> createPatient(@Body SignUpPatienceDto signUpPatienceDto);
@POST("/appointment/book")
Call<ApiResponse> bookAppointment(@Body AppointmentBookingDto appointmentBookingDto, @Field("token") String token);
}
这是我调用该方法的活动
@RequiresApi(api = Build.VERSION_CODES.O)
public void createPatient() {
loadingPB.setVisibility(View.VISIBLE);
int selectedID = radioGroup.getCheckedRadioButtonId();
male = (RadioButton) findViewById(selectedID);
female = (RadioButton) findViewById(selectedID);
if (male.isChecked()) {
selectedGender = male.getText().toString();
} else if (female.isChecked()) {
selectedGender = female.getText().toString();
} else {
selectedGender = "Not specify";
}
date = btnDateOfBirth.getText().toString();
SignUpPatienceDto signUpPatienceDto = new SignUpPatienceDto();
signUpPatienceDto.setDateOfBirth(LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy/MM/dd")));
signUpPatienceDto.setEmail(email.getText().toString());
signUpPatienceDto.setName(name.getText().toString());
signUpPatienceDto.setPassword(password.getText().toString());
signUpPatienceDto.setProfileImage("Profile image not available yet");
signUpPatienceDto.setGender(selectedGender);
Call<ResponseBody> call = BaseUrlClient
.getInstance().getApi().createPatient(signUpPatienceDto);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
Toast.makeText(PatientRegistrationActivity.this, response.message(), Toast.LENGTH_SHORT).show();
Log.d("Main",response.body().toString());
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.d("Main",t.getMessage());
}
});
}
我不知道为什么当我尝试获取响应时它总是返回空引用,但相同的 api 端点在邮递员和 swagger 中都工作正常。
答:
0赞
ahjo4321hsotuhsa
9/21/2022
#1
您的日志显示第 215 行的 PatientRegistrationActivity 中存在错误。 在这里,您正在尝试将 null 转换为 String。在解析值之前,应进行 null 检查。使用调试器或日志确认这一点
评论
0赞
Ukeme Elijah
9/21/2022
端点以反斜杠开头,所以我认为它仍然是一样的?
0赞
Ukeme Elijah
9/21/2022
我已经尝试过了,但它仍然给我同样的错误,我认为问题出在我的 ApiClient 类中的 post 方法。也许它需要某种格式
0赞
Ukeme Elijah
9/21/2022
这就是我使用大摇大摆时响应标头的显示方式。我不知道我是否需要将其包含在 ApiClient 类中。 连接:保持活动 内容类型:application/json 日期:2022 年 9 月 21 日星期三 04:52:02 GMT 保持活动状态:超时=60 传输编码:分块 变化:来源、访问控制请求方法、访问控制请求标头
评论