[Android Studio] Retrofit JsonReader.setLenient(true) 오류
|2024. 10. 22. 23:54
스프링부트 Controller
@PostMapping("join/president")
public ResponseEntity<String> joinPresident(@RequestBody PresidentJoinRequest joinRequest) {
try {
jwtLoginService.joinPresident(joinRequest);
return ResponseEntity.ok("President 가입 성공");
} catch (IllegalArgumentException e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
안드로이드 ApiService
@POST("/api/jwt-login/join/president")
Call<String> joinPresident(@Body PresidentJoinRequest presidentJoinRequest);
안드로이드 Retrofit
private void joinPresident(String presidentName, String presidentEmail, String presidentPassword, String presidentNumber, String presidentBusinessNumber){
LoginApiService loginApiService = LoginRetrofitClient.getRetrofitInstance().create(LoginApiService.class);
PresidentJoinRequest requestBody = new PresidentJoinRequest(presidentName, presidentEmail, presidentPassword, presidentNumber ,presidentBusinessNumber);
Call<String> call = loginApiService.joinPresident(requestBody);
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
Log.d("Retrofit Response", "Code: " + response.code() + ", Body: " + response.body());
if(response.isSuccessful() && response.body() != null){
showAlertDialog("가입 완료", "가입이 완료되었습니다.");
Intent intent = new Intent(PresidentJoin.this, Login.class);
startActivity(intent);
}else{
showAlertDialog("가입 실패", "가입에 실패하였습니다.");
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
showAlertDialog("가입 실패", "가입에 실패하였습니다.2");
Log.e("Retrofit Error", "Failure: " + t.getMessage());
}
});
}
현재 문제점
- "/api/jwt-login/join/president"의 api가 잘 작동하고 database에 값이 잘 저장이되지만 아래 에러가 발생
@Override
public void onFailure(Call<String> call, Throwable t) {
showAlertDialog("가입 실패", "가입에 실패하였습니다.2");
Log.e("Retrofit Error", "Failure: " + t.getMessage());
}
에러코드는
Retrofit Error com.eatda E Failure: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $
이렇게 발생
오류 발생시 떠올랐던 문제점들
1. api 반환값이 단순 String이라 처리를 못하는건지?
2. ip를 잘못 할당했는지? -> 다른 api는 잘 작동하여서 아님
3. request값 순서가 잘못됐는지? -> 아님
1번으로 해결해보자
찾아보니 Retrofit에서 문자열(String) 응답을 처리하기 위해 ScalarsConverterFactory를 추가해야 한다고 한다.
1. 의존성 추가
dependencies {
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
}
2. retrofitClient에 코드 추가
public class LoginRetrofitClient {
private static Retrofit retrofit;
public static Retrofit getRetrofitInstance() {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(Local.ip)
.addConverterFactory(ScalarsConverterFactory.create()) // 문자열 응답 처리
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
.addConverterFactory(ScalarsConverterFactory.create()) // 문자열 응답 처리
이 코드만 추가해줬다.
결과
성공~
결론
스프링부트에서 string형의 응답형을 반환하면
안드로이드에서의 문자열 응답처리 코드를 retrofit 인스턴스에 추가해야된다.
'🌠Development > Android Studio' 카테고리의 다른 글
[Android Studio] 공공데이터 API 사용해보기 (0) | 2024.10.23 |
---|---|
[Android Studio] 스프링부트 api retrofit 연동 (0) | 2024.10.22 |
[Android Studio] 패키지 구성 확인하기 (0) | 2024.04.12 |
[Android Studio] 뷰와 뷰의 속성 (0) | 2024.04.12 |
[Android Studio] Intent(인텐트) (0) | 2024.04.12 |