我正在Glassfish服务器中开发一个restlet服务器,它将从Android客户端收到请愿书。
基于Hello World application和Object serialization tutorial
以下是一些代码:
服务器端
MyUser.java
package com.server.common;
import java.io.Serializable;
public class MyUser implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
public MyUser() {}
public MyUser(String username) {
super();
this.username = username;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
UserResource.java
package com.server.common;
import org.restlet.resource.Get;
public interface UserResource {
@Get
public MyUser getUser();
}
UserServerResource.java
package com.server;
import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;
import com.server.common.MyUser;
import com.server.common.UserResource;
public class UserServerResource extends ServerResource implements UserResource {
@Get
public MyUser getUser() {
MyUser u = new MyUser("Nickname from server");
return u;
}
}
客户端
包com.client.common
MainActivity.java extract
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ClientResource cr = new ClientResource(
"http://MYSERVERIP:8080/FamilyWeb/username");
resource = cr.wrap(UserResource.class);
try {
MyUser u = resource.getUser();
Log.w("success",u.toString());
} catch (Exception e) {
e.printStackTrace();
}
logcat的
09-29 22:31:52.650: W/System.err(1409): java.lang.NullPointerException
09-29 22:31:52.650: W/System.err(1409): at com.dimunoz.family.tablet.MainActivity.onCreate(MainActivity.java:33)
09-29 22:31:52.650: W/System.err(1409): at android.app.Activity.performCreate(Activity.java:4465)
09-29 22:31:52.650: W/System.err(1409): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
09-29 22:31:52.660: W/System.err(1409): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
09-29 22:31:52.660: W/System.err(1409): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
09-29 22:31:52.660: W/System.err(1409): at android.app.ActivityThread.access$600(ActivityThread.java:123)
09-29 22:31:52.660: W/System.err(1409): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
09-29 22:31:52.660: W/System.err(1409): at android.os.Handler.dispatchMessage(Handler.java:99)
09-29 22:31:52.660: W/System.err(1409): at android.os.Looper.loop(Looper.java:137)
09-29 22:31:52.660: W/System.err(1409): at android.app.ActivityThread.main(ActivityThread.java:4424)
09-29 22:31:52.660: W/System.err(1409): at java.lang.reflect.Method.invokeNative(Native Method)
09-29 22:31:52.660: W/System.err(1409): at java.lang.reflect.Method.invoke(Method.java:511)
09-29 22:31:52.660: W/System.err(1409): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-29 22:31:52.660: W/System.err(1409): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-29 22:31:52.660: W/System.err(1409): at dalvik.system.NativeStart.main(Native Method)
如果我更改getUser()方法以返回一个String对象并进行相应的更改,我的Android客户端会获得响应,但是如果我运行上面显示的代码,我会得到一个NullPointerException。
我错过了什么?
答案 0 :(得分:0)
问题是公共文件包的名称在服务器和客户端中是不同的,因此解决方案是将它们重命名为相同的名称。
在Restlet Mailing List其中一位版主Thierry Boileau回答我为什么他们应该有相同的名字:
服务器和客户端部分之间的公共类(例如类 对于序列化/反序列化的bean对象,必须位于 相同的包裹。原因是序列化/反序列化 流程利用公约,特别是关于完整的公约 bean类的路径在JSON表示中引用。 所有其他类,如ClientResource,带注释的接口都可以 位于客户端/服务器项目之间的不同包中。