1

我的一个类中有许多构造函数,所以我认为实现 Bloch 的“构建器模式”是个好主意(请参阅http://www.informit.com/articles/article.aspx?p=1216151&seqNum=2)对于其中一个类(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 的一个 rgular 属性,它必须被序列化,尽管它不应该被序列化。因此,为此方法选择另一个名称(如builder()),或使用 @JsonIgnore 对其进行注释,以使 Jackson 知道该属性不能被序列化。

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

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

将其设为静态也将解决最初的问题,因为getBuilder()Jackson 不再将方法视为 bean 属性。有关此模式的示例实现,请参阅Google Guavabuilder() :请注意,该方法是静态的,并且命名为.

于 2013-11-11T16:48:17.813 回答