A anotação @UISchema é o ponto de entrada para descrever
como a UI deve renderizar campos definidos em DTOs ou
entidades. Ela trabalha em conjunto com
FieldConfigProperties, ValidationProperties e
o CustomOpenApiResolver para produzir um
OpenAPI enriquecido com metadados x-ui.
controlType, group,
order, etc.).@NotBlank, @Size, @Pattern) são
convertidas em mensagens e flags x-ui.validation
automaticamente.@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface UISchema {
String label();
String controlType() default "text";
String group() default "default";
boolean required() default false;
FieldDataType dataType() default FieldDataType.TEXT;
String numericFormat() default ""; // usa NumberFormatStyle
String[] extraProperties() default {};
}Campos numéricos podem usar enums como
NumberFormatStyle.PERCENT.
CustomOpenApiResolverdescricao, observacao
etc.).x-ui.validation (mensagens amigáveis
incluídas).extraProperties — recebem prioridade
máxima para cenários específicos ou integrações customizadas.Consulte o diagrama completo de precedência em docs/architecture-overview.md.
order): sempre defina para
manter consistência nos formulários.group): organize campos
em blocos semânticos (por exemplo, dadosPessoais,
endereco).formHidden,
tableHidden, filterable para controlar cada
contexto.requiredMessage, rangeMessage via
ValidationProperties quando necessário.valuePresentation): trate este bloco como o
contrato canônico de display/read-only. O starter publica
x-ui.valuePresentation automaticamente a partir de
type, format, controlType e
numericFormat; quando precisar sobrescrever, prefira
extraProperties com chaves aninhadas, como
valuePresentation.type.ValidationPropertiesValidationProperties define o vocabulário aceito em
x-ui.validation. Exemplos:
| Propriedade | Uso |
|---|---|
required |
Campo obrigatório |
minLength / maxLength |
Limites de tamanho para texto |
pattern |
Expressão regular aplicada pelo frontend |
fileTypeMessage |
Mensagem customizada para validação de upload |
Essas chaves são preenchidas automaticamente pelo resolver, mas podem
ser sobrescritas via extraProperties.
dataEndpoint
para conectar combos a endpoints /options
padronizados.conditionalDisplay e dependentField para
interfaces dinâmicas.MessageSource e resolva em runtime usando
LocaleUtils.