Получение NullPointerException при попытке получить сериализованный объект в Restlet

Я разрабатываю рестлет-сервер внутри сервера Glassfish, который будет получать петиции от клиента Android.

На основе приложения Hello World и на Руководство по сериализации объектов

Вот код:


Сторона сервера

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;
}
}

Сторона клиента

  • Те же UserResource.java и MyUser.java внутри пакета com.client.common

  • Извлечение 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();
    }
    

ЛогКэт

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.

Что мне не хватает?


person DMunoz    schedule 29.09.2012    source источник
comment
Похоже, вы не устанавливаете его до его получения, и, поскольку String является объектом, он вернет null, если он не был установлен или инициализирован при объявлении. В любом случае вывод logcat должен подтвердить. Пожалуйста, разместите это.   -  person Simon    schedule 30.09.2012
comment
Собственно, я и устанавливаю. MyUser u = new MyUser(псевдоним с сервера) вызывает конструктор MyUser(строковое имя пользователя)   -  person DMunoz    schedule 30.09.2012
comment
Ах, да, извините. Однако logcat все еще может помочь. Какая строка вызывает исключение?   -  person Simon    schedule 30.09.2012
comment
Log.w(успех,u.toString()); линия. Наблюдая за проблемой в режиме отладки, я увидел, что объект MyUser имеет значение null.   -  person DMunoz    schedule 30.09.2012
comment
@Simon Я только что добавил LogCat   -  person DMunoz    schedule 30.09.2012


Ответы (1)


Проблема заключалась в том, что имена пакетов общих файлов на сервере и клиенте были разными, поэтому решением было переименовать их в одно и то же имя.

В списке рассылки Restlet мне ответил один из модераторов, Тьерри Буало. почему они должны иметь одно и то же имя:

общие классы между серверной и клиентской частями (например, классы для сериализованных/десериализованных объектов bean-компонентов) должны находиться в одних и тех же пакетах. Причина в том, что процесс сериализации/десериализации использует соглашения, в частности соглашение о полном пути к классам компонентов, на которое ссылаются в представлении JSON. Все другие классы, такие как ClientResource, аннотированные интерфейсы, могут быть расположены в отдельных пакетах между проектами клиент/сервер.

person DMunoz    schedule 06.10.2012