2012-04-25 17 views
2

こんにちは私はjacksonを使用して保護されたコンストラクタでクラス(SimpleExpression)をシリアライズしてデシリアライズしようとしています。 gsonを使うと問題はありませんが、jacksonは保護されたコンストラクタを処理できないようです。 mixinアノテーションを使ってみましたが、うまくいきませんでした。シリアル化は問題なく動作します。ジャクソンスロー:Jacksonと保護されたコンストラクタをデシリアライズ

com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type 

ヘルプがありますか? マイコード:

private static SimpleExpression create(String json) throws JsonParseException, JsonMappingException, IOException 
{ 
    ObjectMapper mapper = new ObjectMapper().setVisibility(PropertyAccessor.ALL, Visibility.ANY); 
    SimpleExpression sp = null; 
    sp = mapper.readValue(json, SimpleExpression.class); 
    return sp; 
} 

SimpleExpressionクラスは、私はゲッターとセッターをomitingよ。

public class SimpleExpression implements Criterion 
{ 
private static final long serialVersionUID = 1L; 

private final String propertyName; 

private final Object value; 

private boolean ignoreCase; 

private final String op; 

private final String type; 

protected SimpleExpression(String propertyName, Object value, String op) 
{ 
    this.propertyName = propertyName; 
    this.value = value; 
    this.op = op; 
    this.type = value.getClass().getName(); 
} 

protected SimpleExpression(String propertyName, Object value, String op, boolean ignoreCase) 
{ 
    this.propertyName = propertyName; 
    this.value = value; 
    this.ignoreCase = ignoreCase; 
    this.op = op; 
    this.type = value.getClass().getName(); 
} 
} 
+0

あなたは、SimpleExpression' 'のクラスDEFが含まれている必要があり、それがうまく働きました。 – StaxMan

+0

私はそれを忘れてしまった。 –

答えて

3

保護された部分は問題ありません(問題はありません)が、おそらくコンストラクタは引数をとります。デフォルト以外のコンストラクタを使用する場合は、@JsonCreatorを使用します。それを超えて使用するコンストラクタ(または静的なファクトリメソッド)の種類に依存します。

詳細を知るには、クラス定義が必要です。もう一つの可能​​性は、非静的な内部クラスを扱おうとしていることです。

+0

はい、引数をとりますが、ライブラリからクラスコンストラクタにアクセスできない場合は、注釈を付けることはできません。したがって、コンストラクタに注釈を付ける必要があるオブジェクトを再構築するために、Jacksonは引数なしのコンストラクタを使用しようとします。 –

+0

アノテーションなしの正解ジャクソンは他の要素を認識できません(ctorパラメータ名はバイトコードに格納されていないため)。しかし、コンストラクタ(メソッドやフィールドだけでなく)でも、ミックスインアノテーションを使用することができます。[http://wiki.fasterxml.com/JacksonMixInAnnotations]を参照してください。 – StaxMan

+0

Wrtミックスイン注釈:コンストラクタと一致するダミークラスを定義するだけです(同じ引数型の同じ順序)。それを '@ JsonCreator'でマークし、各パラメータに一致するJSON名を指定する' @JsonProperty'を付けます。 'ObjectMapper'のミックスインアノテートを登録するとうまくいくはずです – StaxMan

0

スレッドにany1が来た場合。 私は同じ問題を抱えていました。 私は、コンストラクタ

protected SimpleExpression(){} 

を追加し、それは何かが欠けているものだから

+0

最終的な属性が初期化されていないため、これはコンパイルされません。各属性を明示的にヌルまたはデフォルト値に設定すると機能します。 –

関連する問題