Bloch的Spring模式与Spring

时间:2013-11-11 16:34:10

标签: java spring design-patterns constructor javabeans

我的一个类中有很多构造函数,所以我认为为其中一个类(Spring Project)实现Bloch的“Builder Pattern”(参见http://www.informit.com/articles/article.aspx?p=1216151&seqNum=2)是个好主意。

很可能,我错过了一些东西,因为我在针对Class运行测试用例时遇到了“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
     }

1 个答案:

答案 0 :(得分:4)

这个例外与Spring没什么关系。它只与Jackson如何自动将对象序列化为JSON有关。你在你的类中添加了一个方法getBuilder(),杰克逊认为这是你的bean的rgular属性,必须被序列化,尽管它不应该。因此,请为此方法选择其他名称(如builder()),或使用@JsonIgnore对其进行注释,以使Jackson知道此属性不得序列化。

那就是说,我真的不明白为什么这个方法不是static。您不必创建新的AllTweets对象以便能够从中获取构建器,以便能够构建另一个AllTweets对象。因此,该方法应该是静态的,以便能够简单地进行

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

使其成为静态也将解决最初的问题,因为杰克逊不再将getBuilder()方法视为bean属性。有关此模式的示例实现,请参阅Google Guava:请注意,该方法是静态的,名为builder()