尝试在Restlet中获取序列化对象时获取NullPointerException

时间:2012-09-29 20:10:01

标签: android object serialization nullpointerexception restlet

我正在Glassfish服务器中开发一个restlet服务器,它将从Android客户端收到请愿书。

基于Hello World applicationObject 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

  • 中的相同UserResource.java和MyUser.java
  • 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。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

问题是公共文件包的名称在服务器和客户端中是不同的,因此解决方案是将它们重命名为相同的名称。

Restlet Mailing List其中一位版主Thierry Boileau回答我为什么他们应该有相同的名字:

  

服务器和客户端部分之间的公共类(例如类   对于序列化/反序列化的bean对象,必须位于   相同的包裹。原因是序列化/反序列化   流程利用公约,特别是关于完整的公约   bean类的路径在JSON表示中引用。   所有其他类,如ClientResource,带注释的接口都可以   位于客户端/服务器项目之间的不同包中。