我是Android编程的初学者。刚开始。
现在我正在尝试使用改造在Android和Tomcat服务器之间进行通信
但每当我点击登录按钮时,这个错误让我发疯。
java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #1)
这是我的错误..
java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #1)
for method NetworkService.postLogin
at com.example.ab.MainActivity.networkServiceModule(MainActivity.java:68)
at com.example.ab.MainActivity$1.onClick(MainActivity.java:50)
我在gradle中添加了这些
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
界面:
public interface NetworkService {
@POST("/Attendance/login.jsp")
Call<PostJson> postLogin(PostJson postJson);
}
MainActivity的某些部分:
ApplicationController application = ApplicationController.getInstance();
application.buildNetworkService("xxx.xxx.xxx.xxx",8080);
networkService = ApplicationController.getInstance().getNetworkService();
login_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String ID = id.getText().toString();
String Pwd = password.getText().toString();
networkServiceModule(ID,Pwd); //this is line 50.
}
});
public void networkServiceModule(String ID, String Pwd){
Log.d("networkServiceModule","ID : "+ID);
Log.d("networkServiceModule","PW : "+Pwd);
Call<PostJson> thumbnailCall = networkService.postLogin(new PostJson(ID,Pwd)); //this is line 68.
thumbnailCall.enqueue(new Callback<PostJson>() {
@Override
public void onResponse(Response<PostJson> response, Retrofit retrofit) {
if(response.isSuccess()) {
String resultCode = response.body().getResult_code().toString();
Toast.makeText(getBaseContext(), "Login : " + resultCode, Toast.LENGTH_SHORT).show();
} else {
int statusCode = response.code();
Log.d("networkServiceModule", "response Code : "+statusCode);
}
}
ApplicationController:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import retrofit.GsonConverterFactory;
import retrofit.Retrofit;
public class ApplicationController extends Application {
private static ApplicationController instance;
public static ApplicationController getInstance() {
return instance;
}
@Override
public void onCreate() {
super.onCreate();
ApplicationController.instance = this;
}
private NetworkService networkService;
public NetworkService getNetworkService() {
return networkService;
}
private String baseUrl;
public void buildNetworkService(String ip, int port) {
synchronized (ApplicationController.class) {
baseUrl = String.format("http://%s:%d", ip, port);
Gson gson = new GsonBuilder()
.create();
GsonConverterFactory factory = GsonConverterFactory.create(gson);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(factory)
.build();
networkService = retrofit.create(NetworkService.class);
}
}
}
我一直试图应用我从StackOverflow获得的一些解决方案,但未能找到我的解决方案..
这是我在StackOverFlow上的第一个问题,对于看起来丑陋的代码感到抱歉。
答案 0 :(得分:2)
您忘记注释改装方法参数。请尝试以下
@POST("/Attendance/login.jsp")
Call<PostJson> postLogin(@Body PostJson postJson);
答案 1 :(得分:1)
问题在于PostJson postJson
,每个以前的参数都必须与改装注释相关联。在您的情况下,应该是您的帖子请求的正文。
Call<PostJson> postLogin(@Body PostJson postJson);
答案 2 :(得分:0)
您忘了对改造方法的参数@Body进行注释
@POST("/Attendance/login.jsp")
Call<PostJson> postLogin(PostJson postJson);
答案 3 :(得分:0)
尽管此答案与问题没有特别联系,但我在解决问题时发现自己在这里。我解决了,因此分享。
即使没有参数#2,我仍试图与协程一起使用改造并出现错误Retrofit Error : No Retrofit annotation found. (parameter #2)
。
/**
* Suspend function to get media of the day for the day when this function is called.
* Will return a Media object in the response.
*/
@GET("planetary/apod")
suspend fun getTodaysMedia(@Query("api_key") apiKey: String): Media
通过升级改造版本来解决此问题: version_retrofit = "2.9.0"