Java 从Spring请求反序列化不可变

Java 从Spring请求反序列化不可变,java,spring,immutables-library,Java,Spring,Immutables Library,我很难弄清楚如何将Spring请求参数反序列化为不可变对象 我的不可变类如下所示: @JsonDeserialize(as = ImmutableItemsSelector.class) @Value.Immutable public interface ItemsSelector { Set<String> getNames(); Set<String> getSubtypes(); } @JsonDeserialize(as=ImmutableItemsSe

我很难弄清楚如何将Spring请求参数反序列化为不可变对象

我的不可变类如下所示:

@JsonDeserialize(as = ImmutableItemsSelector.class)
@Value.Immutable
public interface ItemsSelector {
  Set<String> getNames();
  Set<String> getSubtypes();
}
@JsonDeserialize(as=ImmutableItemsSelector.class)
@值。不可变
公共接口项选择器{
设置getNames();
设置getsubtype();
}
我的Spring控制器如下所示:

@GetMapping("/items") // Example url: /items?names=stest,stest2&subtypes=w1,w2
public Set<Items> getItems(ItemsSelector itemsSelector) {
  return itemService.getItems(itemsSelector);
}
@GetMapping(“/items”)//示例url:/items?name=stest,stest2&subtype=w1,w2
公共设置getItems(ItemsSelector ItemsSelector){
returnitemservice.getItems(itemsSelector);
}
很简单,对吧?除了它不适用于
@Value。不可变的

找不到接口的主构造函数或默认构造函数 项目选择器

查看ImmutableItemsSelector生成的代码显然是有意义的,因为构造函数是私有的。所以我尝试使用
@Value.Modifiable
和。。。它起作用了!但我真的不喜欢只为Spring生成两个ItemsSelector实现。它也违背了不变性的全部目的


没有更简单的方法将请求参数反序列化为ImmutableItemsSelector吗?

对于数据绑定,您需要一个默认构造函数或提供一个包含所有参数的构造函数。您需要将具体类型添加到该方法中,而不是接口中,因为Spring将无法创建接口的实例。(除非您正在使用的库为其添加了一些魔力)。