스프링부트 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 인스턴스에 추가해야된다.