Converts the DashboardAliasFilter marker interface into an abstract base class so the resolveMultiple flag, which the UI persists on every entityAlias filter, has a single home. Drops the extends DashboardAliasFilter from DashboardStatefulRootFilter (interface cannot extend a class); its two implementers now extend the base and implement the interface directly.
Subtypes pick up resolveMultiple via inheritance and gain @EqualsAndHashCode(callSuper = true) / @ToString(callSuper = true) to keep Lombok semantics correct.
Drops the custom class-level @Constraint annotation and its inner ConstraintValidator in favor of a Jakarta @AssertTrue default method on DashboardStatefulRootFilter. All implementers inherit the check automatically.
DashboardDataValidator now strips the misleading "field '<name>'" prefix when rendering @AssertTrue violations, so the message reads as a class-level condition.
In Jackson 2.18.x, EXISTING_PROPERTY type info combined with the no-arg
@JsonIgnoreProperties causes the triggerType discriminator field to be
silently excluded from the serialized JSON. When the server then tries to
deserialize the POST body for /api/notification/rule, Jackson cannot find
triggerType and throws "missing type id property 'triggerType'", resulting
in a 500 for NotificationEdgeTest.testNotificationRule.
Fix by:
1. Adding @JsonProperty("triggerType") to force the field into normal bean
serialization, overriding any suppression by the type info machinery.
2. Replacing the no-arg @JsonIgnoreProperties with @JsonIgnoreProperties(
ignoreUnknown = true) so unknown properties are ignored rather than
causing errors (e.g. for forward compatibility).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>