0

汎用モデルを使用して、WebSocket を介してサーバーからクライアントにさまざまなデータをブロードキャストしたいと考えています。残念ながら、次のクラス構造をシリアル化しようとすると、常にエラーが発生します。

SimpleJson を使用してシリアル化するクラス:

public class UpdateBroadcastMessageData {
    private List<UpdateBroadcastModel<? extends Object>> models = new ArrayList<UpdateBroadcastModel<? extends Object>>();

    public void clearModels() {
        ...
    }

    public void addModel(Object model) {
        ...
    }

    public void removeModel(Object model) {
       ...
    }
}

public class UpdateBroadcastModel<T extends Object> {
    private String clazz = null;
    private T payload = null;
    ...
}

私の JsonUtil クラスは、常に「Json に変換できませんでした」というメッセージをスローします。

import org.codehaus.jackson.map.ObjectMapper;

public class JsonUtil {
    private static ObjectMapper mapper = new ObjectMapper();

    public static String convertToJson(Object object) {
    try {
        return mapper.writeValueAsString(object);
    } catch (Exception e) {
        log.error("Could not convert Object to JSON", e);
        return "";
    }
}

public static <T> T convertToObject(String json, Class<T> clazz) {
    try {
        return mapper.readValue(json, clazz);
    } catch (Exception e) {
        log.error("Could not convert JSON to Object", e);
        return null;
    }
}
 }

誰かが私を助けて、上記のデータ構造をシリアライズできるようにするために何をすべきか教えてもらえますか?

このエラーは converttoJson メソッドに関するものです。スタックトレースは次のとおりです。

ERROR [pool-3-thread-1][JsonUtil:16] Could not convert Object to JSON
org.codehaus.jackson.map.JsonMappingException: No serializer found for class 
...UpdateBroadcastMessageData and no properties discovered to create BeanSerializer 
(to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) )
    at org.codehaus.jackson.map.ser.StdSerializerProvider$1.serialize(StdSerializerProvider.java:62)
    at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:296)
    at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:224)
    at org.codehaus.jackson.map.ObjectMapper._configAndWriteValue(ObjectMapper.java:1512)
    at org.codehaus.jackson.map.ObjectMapper.writeValueAsString(ObjectMapper.java:1262)
    at ...JsonUtil.convertToJson(JsonUtil.java:14)
    at ...CommitPoiTokenAction.doProcess(CommitPoiTokenAction.java:118)
    at ...BaseWebSocketTokenAction.processMessage(BaseWebSocketTokenAction.java:29)
    at ...WebSocketListener$1.run(WebSocketListener.java:145)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
pool-3-thread-1: code=81 len=118

前もって感謝します。ファイコ

4

2 に答える 2

0

ObjectMapperクラスではなくメソッド内で宣言します。

スタックトレースでわかるように、シリアルorg.codehaus.jackson.map.ObjectMapper...化しようとしているときにエラーが発生します。メソッドで宣言しない場合、コンストラクターでオブジェクトをインスタンス化しておらず、マッパーがないため、オブジェクト マッパーはありません。

public static String convertToJson(Object object) {
    ObjectMapper mapper = new ObjectMapper();        
    try {
        return mapper.writeValueAsString(object);
    } catch (Exception e) {
        throw new RuntimeException("Could not convert Object to JSON.", e);
    }
}

public static <T> T convertToObject(String json, Class<T> clazz) {
    ObjectMapper mapper = new ObjectMapper();
    try {
        return mapper.readValue(json, clazz);
    } catch (Exception e) {
        throw new RuntimeException("Could not convert JSON to Object.", e);
    }
}

より良い方法で例外をキャッチすることをお勧めします。アプリケーションがエラーをスローしている場合は、そのエラーをスローする必要があり、無視しないでください。使用するthrow new RuntimeException("Could not convert JSON to <whatever>", e);

アップデート

クラスでゲッター/セッターを宣言することを忘れないでください。

于 2013-05-28T07:44:13.533 に答える