5

私の CXF ベースの REST レイヤーでは、Groovy オブジェクトのシリアライズ/デシリアライズに Jackson を使用しています。私が経験している問題は、setter メソッドを持たないプロパティの逆シリアル化を扱っています。Group オブジェクトのリストを返す getGroups() メソッドを持つドメイン オブジェクト Dashboard があります。シリアル化すると、このオブジェクトは "group" 属性を持つ JSON に適切に変換されます。JavaScript から更新用のオブジェクトを送信すると、JSON にはまだ「グループ」属性があります。このプロパティはドメイン オブジェクトで読み取り専用であるため、JSON を逆シリアル化するときに「グループ」プロパティを単純に無視したいと思います。

私は Jackson ミックスインを使用しているので、@JsonIgnore、@JsonGetter、および @JsonProperty アノテーションのさまざまな組み合わせを試しましたが、すべて役に立ちませんでした。プロパティがシリアル化時に使用できる場合、逆シリアル化で以下のエラーが発生します。「グループ」属性を削除することで JavaScript の JSON オブジェクトを消去できますが、サーバー側のソリューションを見つけたいと考えています。

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Problem deserializing 'setterless' property 'groups': get method returned null (through reference chain: org.ozoneplatform.commons.server.domain.model.DashboardTemplate["groups"])
at com.fasterxml.jackson.databind.deser.impl.SetterlessProperty.deserializeAndSet(SetterlessProperty.java:114)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:198)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:577)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObjectUsingNonDefault(BeanDeserializer.java:393)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:289)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1169)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:625)
at com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:448)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1038)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:614)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:578)
at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:238)

逆シリアル化で読み取り専用プロパティを無視するように Jackson に指示するにはどうすればよいですか?

ありがとうございました、

マイケル

4

3 に答える 3

11

何時間も無駄に過ごした後、私はついにそのような一見些細な問題に対処する呪文の魔法の組み合わせを見つけました。ミックスインでは、この注釈の組み合わせを作成する必要がありました。

@JsonIgnore
abstract Set<Group> groups

@JsonProperty
abstract Set<Group> getGroups()

@JsonIgnore
abstract void setGroups(Set<Group> groups)

その上、ObjectMapperに2つの構成パラメーターを追加する必要がありました。

mapper.configure(MapperFeature.USE_GETTERS_AS_SETTERS, false)
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

同じことを達成するためのより簡単な方法はありませんか?

マイケル

于 2013-03-24T02:03:03.567 に答える
3

同じ問題がありました。解決策は、ゲッターに正しい名前を付けることでした:

List list...
setList(...)

は正しかったのですが、私のゲッターは setProductList()「setterLess」エラーを発生させました。に変更: setList(...)問題を解決しました

于 2013-08-18T08:42:16.063 に答える
1

私はちょうど同じ問題に遭遇しました.私の解決策は、プライベートで操作のないセッターを作成することでした:

public class MyFoo {
    public String getMyStr() {
        return "hello, world";
    }

    private void setMyStr(String ignored) {}
}

プライベートsetMyStrにすることで、コードから誤って呼び出そうとすることを防ぎますが、Jackson はそれを見つけて呼び出します。ジャクソンは、それを呼び出しても何も起こらないことをほとんど知りません-または気にしません-。

于 2014-01-03T22:26:28.030 に答える