### Question:
TagNamesConverter implements ParamConverter<TagNames> { @Override public TagNames fromString(String value) { String[] tokens = value.split(",", -1); Set<String> names = Arrays.stream(tokens).map(token -> { if (token.trim().isEmpty()) { throw new IllegalArgumentException("Invalid tag list:" + value); } String[] parts = token.split(":", -1); if (parts.length > 2) { throw new IllegalArgumentException("Invalid tag list:" + value); } String key = parts[0]; if (key.trim().isEmpty()) { throw new IllegalArgumentException("Invalid tag list:" + value); } return key; }).collect(toSet()); return new TagNames(names); }  @Override TagNames fromString(String value); @Override String toString(TagNames value);  }### Answer:
@Test public void fromString() throws Exception { assertEquals(tags, new TagNamesConverter().fromString(value).getNames()); }