我在后端有 Spring Boot 项目,在前端有 Android 应用程序。两者之间的通信通过 Retrofti2
进行。 。实际上,在其中一个端点上 /login
端点,正在重新调整 HashMap<String, Object>
。该端点如下所示:
@RequestMapping(value = "/login", method = RequestMethod.POST)
public ResponseEntity<?> login(@RequestBody AuthenticationRequest authenticationRequest) throws Exception {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("user", getUserObject());
map.put("token", getJwtToken());
return ResponseEntity.ok(map);
}
方法调用的接口(interface)如下所示:
public interface LoginService {
@POST("login")
Call<HashMap<String, Object>> testLogin(@Body Login login); //login contains username and password strings
}
前端的响应如下所示:
Call<HashMap<String, Object>> call = mLoginService.testLogin(new Login(username, password));
call.enqueue(new Callback<HashMap<String, Object>>() {
@Override
public void onResponse(Call<HashMap<String, Object>> call, Response<HashMap<String, Object>> response) {
if (!response.isSuccessful()){
Toast.makeText(getApplicationContext(), "Wrong credentials!", Toast.LENGTH_SHORT).show();
return;
}
//extract user & token
HashMap<String, Object> map = response.body();
Log.i("Test result", map.get("token").toString());
Log.i("Test result", map.get("user").toString());
User u = (User) map.get("user");
//Toast.makeText(getApplicationContext(), "Welcome " + u.getUsername() + "!", Toast.LENGTH_SHORT).show();
startActivity(goToEmailsIntent);
}
@Override
public void onFailure(Call<HashMap<String, Object>> call, Throwable t) {
Toast.makeText(getApplicationContext(), "Cannot login, look at the console", Toast.LENGTH_SHORT).show();
Log.i("ERRROOOOOOR during login", t.toString());
return;
}
});
当我查看控制台中的日志语句时,一切正常,我得到了我想要的数据。但是当尝试转换为 User 对象时,我遇到了异常。
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.example.email.model.User
如何解决这个问题?有没有更好的方法从后端发送用户对象和字符串?
最佳答案
第一种方法
当您可以更改后端服务时,请修改后端服务返回DTO而不是HashMap。
@RequestMapping(value = "/login", method = RequestMethod.POST)
public ResponseEntity<Token> login(@RequestBody AuthenticationRequest authenticationRequest) throws Exception {
// create your response
Token token = new Token();
return ResponseEntity.ok(token);
}
第二种方法
使用json格式来交换数据,在你的onResponse方法中你可以这样做:
HashMap<String, Object> map = response.body();
// map.get("user) may return a null value
String jsonString = new Gson().toJson(map.get("user));
User user = new Gson().fromJson(jsonString,User.class);
// do other thing as you want
关于java - 如何在Retrofit2中从HashMap<String, Object>中提取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61822781/