【问题标题】:Getting NullPointerException when trying to get serialized object in Restlet尝试在 Restlet 中获取序列化对象时出现 NullPointerException
【发布时间】:2012-09-29 20:10:01
【问题描述】:

我正在 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 提取

    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。

我错过了什么?

【问题讨论】:

  • 在获取它之前您似乎没有设置它,并且由于 String 是一个对象,除非它已设置或在声明时初始化,否则将返回 null。无论如何,logcat 输出应该可以确认。请张贴。
  • 其实我在设置。 MyUser u = new MyUser("Nickname from server") 调用构造函数 MyUser(String username)
  • 啊,是的,对不起。 logcat 可能仍然有帮助。哪一行导致异常?
  • Log.w("success",u.toString());线。在调试模式下观察问题,我看到 MyUser 对象为空。
  • @Simon 我刚刚添加了 LogCat

标签: android object serialization nullpointerexception restlet


【解决方案1】:

问题是服务器端和客户端的公共文件包名不一样,解决方法是重命名为同名。

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

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

【讨论】:

    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 2018-12-10
    相关资源
    最近更新 更多