1

クラスの 1 つに多数のコンストラクターがあるため、Bloch の「ビルダー パターン」を実装することをお勧めします ( http://www.informit.com/articles/article.aspx?p=1216151&seqNum=2を参照) 。クラスの1つ(Spring Project)。

クラスに対してテスト ケースを実行すると、「IllegalArgumentException」が発生するため、何かを見落としている可能性があります。Spring はこの種のものを許可しますか、それとも従来の複数のコンストラクター アプローチを選択するだけでよいでしょうか?

java.lang.IllegalArgumentException: No serializer found for class com.AllTweets$Builder and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: com.AllTweets["builder"])
at org.codehaus.jackson.map.ObjectMapper._convert(ObjectMapper.java:2502)
at org.codehaus.jackson.map.ObjectMapper.convertValue(ObjectMapper.java:2482)
at org.springframework.data.redis.hash.JacksonHashMapper.toHash(JacksonHashMapper.java:52)
at org.springframework.data.redis.hash.DecoratingStringHashMapper.toHash(DecoratingStringHashMapper.java:4
...

クラス

public class AllTweets implements Serializable{
....

 public Builder getBuilder() {
     return new Builder();
    }

 public static class Builder {
        private AllTweets build;

        public Builder() {
            build = new AllTweets();
        }
        public Builder isTweet(Tweet tweet){
            build.id = tweet.getId();
            return this;
        }
        public Builder isRetweet(Retweet retweet){
            build.id = retweet.getId();
            return this;
        }
        public AllTweets build(){               
            return build;
        }
//Acessors
     }
4

1 に答える 1

4

この例外は、Spring とはあまり関係がありません。Jackson がオブジェクトを JSON に自動的にシリアル化する方法にのみ関係があります。メソッドgetBuilder()をクラスに追加すると、Jackson はそれを Bean の通常のプロパティとして認識し、シリアル化する必要がありますが、そうすべきではありません。したがって、このメソッドに別の名前 ( などbuilder()) を選択するか、 @JsonIgnore でアノテーションを付けて、このプロパティをシリアル化してはならないことを Jackson に認識させます。

とはいえ、なぜこのメソッドがそうでないのか、私には本当にわかりませんstatic。別の AllTweets オブジェクトを構築できるようにするために、そこからビルダーを取得できるようにするために、新しい AllTweets オブジェクトを作成する必要はありません。したがって、メソッドは静的である必要があり、簡単に実行できます

AllTweets result = AllTweets.getBuilder().isTweet(foo).isShare(bar).build();

getBuilder()また、Jackson はメソッドを Bean プロパティと見なさなくなるため、静的にすることで最初の問題も解決します。このパターンの実装例については、 Google Guavaを参照してください。メソッドは静的であり、 という名前が付いていることに注意してくださいbuilder()

于 2013-11-11T16:48:17.813 に答える