Your example code has some problems:
Set<String> selection = new HashSet<>();
set.forEach(item -> {
if (item.contains("o")) {
selection.add(item);
}
});
Bean bean = new Bean();
select.setValue(selection);
binder.forField(select)
.asRequired("Empty selection not allowed")
.withValidator(sel -> sel.size() == 2 && sel.contains("Two") && sel.contains("Four"),"Selection needs to contain two and four")
.bind(Bean::getSelection,Bean::setSelection);
binder.setBean(bean);
Your are setting the value directly, instead of setting the selection in the bean, so the value is set when “binder.setBean(bean)” is called. Have you actually run this test?