Java 布洛赫&x27;带Spring的s-Builder模式

Java 布洛赫&x27;带Spring的s-Builder模式,java,spring,design-patterns,constructor,javabeans,Java,Spring,Design Patterns,Constructor,Javabeans,我的一个类中有许多构造函数,因此我认为为其中一个类(Spring项目)实现Bloch的“构建器模式”(请参阅)是一个好主意 很有可能,我在对类运行测试用例时遇到了“IllegalArgumentException”,因此错过了一些东西。Spring允许这种类型的东西吗?还是我应该选择传统的多构造函数方法 java.lang.IllegalArgumentException: No serializer found for class com.AllTweets$Builder and no pr

我的一个类中有许多构造函数,因此我认为为其中一个类(Spring项目)实现Bloch的“构建器模式”(请参阅)是一个好主意

很有可能,我在对类运行测试用例时遇到了“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
...
阶级


这个异常与Spring没有太大关系。它只与Jackson如何自动将对象序列化为JSON有关。您向类中添加了一个方法
getBuilder()
,Jackson将其视为必须序列化的bean的rgular属性,尽管它不应该被序列化。因此,请为此方法选择另一个名称(如
builder()
),或使用@JsonIgnore对其进行注释,以使Jackson意识到此属性不能序列化

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

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

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

此异常与Spring没有太多关系。它只与Jackson如何自动将对象序列化为JSON有关。您向类中添加了一个方法
getBuilder()
,Jackson将其视为必须序列化的bean的rgular属性,尽管它不应该被序列化。因此,请为此方法选择另一个名称(如
builder()
),或使用@JsonIgnore对其进行注释,以使Jackson意识到此属性不能序列化

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

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

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

,根本没有理由使用此方法??您通过以下操作访问生成器:新建AllTweets.builder()…build()??这不是绝对必要的,但有一个工厂的方法是一件很好的事情。像皮带是很好的,当你穿着吊带?我看不到,但是。。。teho..根本没有理由使用这种方法??您通过以下操作访问生成器:新建AllTweets.builder()…build()??这不是绝对必要的,但有一个工厂的方法是一件很好的事情。像皮带是很好的,当你穿着吊带?我看不到,但是。。。泰奥。。