Validación de Mensajes
Al trabajar con mensajes enviados entre máquinas separadas, incluso al trabajar contra un esquema específico, a menudo pueden surgir problemas con la validez de los mensajes. Estos suelen deberse a errores de programación, errores de entrada de datos o desajustes en la versión del esquema. Tanto los conectores de envío como los de recepción pueden configurarse opcionalmente para validar los mensajes antes de enviarlos o después de recibirlos.
Send Connector s
Para agregar validación a un sending connector, una implementación de la Validator se debe proporcionar una interfaz al construir el conector.
public interface Validator {
ValidationReport validate(TransportMessage transportMessage);
}
La biblioteca de conectores proporciona dos validadores, uno para JSON Esquema y otro para XML Esquema. La validación se realiza contra un TransportMessage antes de que sea enviado al transporte.
XML Validación de Esquema
El XML la implementación de validación del Validador es XmlSchemaValidator.
Se requiere un InputStream que represente el esquema a utilizar, contra el cual se validarán todos los mensajes que pasen a través de este validador.
String xmlSchema = "/validation/sample-schema.xsd";
InputStream xmlSchemaStream = getClass().getResourceAsStream(xmlSchema);
XmlSchemaValidator xmlValidator = new XmlSchemaValidator(xmlSchemaStream);
SendConnector<ExampleType, ExampleType> sendConnectorWithXmlValidator
= new SendConnector.Builder<ExampleType, ExampleType>(connectorName)
.withActorSystem(actorSystem)
.withConnectorTransport(transport)
.withCorrelationIdExtractor(correlationIdExtractor)
.withValidator(xmlValidator) (1)
.build();
| 1 | Agrega el XML validador de esquema para el conector. |
En el ejemplo anterior, estamos cargando un XML Documento de esquema desde el classpath como un input stream.
Este es el patrón de uso más común para XmlSchemaValidator.
Es posible configurar utilizando otros tipos de input stream, como un ByteArrayInputStream para cargar el esquema desde una cadena.
El XML El validador implementa protección contra la inyección de entidades externas (XXE) de acuerdo con el Hoja de trucos de OWASP sobre el tema.
JSON Validación de Esquema
El JSON la implementación de validación del Validador es JsonSchemaValidator.
Se configura de manera similar a la XML validador, donde debemos pasar un InputStream que representa el esquema para validar los mensajes.
String jsonSchema = "/com/github/fge/jsonschema/examples/fstab.json";
InputStream jsonSchemaStream = getClass().getResourceAsStream(jsonSchema);
JsonSchemaValidator jsonValidator = new JsonSchemaValidator(jsonSchemaStream);
SendConnector<ExampleType, ExampleType> sendConnectorWithJsonValidator
= new SendConnector.Builder<ExampleType, ExampleType>(connectorName)
.withActorSystem(actorSystem)
.withConnectorTransport(transport)
.withCorrelationIdExtractor(correlationIdExtractor)
.withValidator(jsonValidator) (1)
.build();
| 1 | Agrega el JSON validador de esquema para el conector. |
El predeterminado JSON la versión del esquema es draft-04 el estándar de facto.
Receive Connector s
Para agregar validación a un sending connector, una implementación del BeanValidator se debe proporcionar una interfaz al construir el conector.
public interface BeanValidator<T> {
BeanValidationReport validate(T message);
BeanValidator<T> withConnectorName(String connectorName);
}
La biblioteca de conectores proporciona un validador para bean validación utilizando la implementación del validador Hibernate. La validación se realiza contra el mensaje una vez que ha sido transformado de un TransportMessage al tipo de destino mediante la función ReceiveTransportMessageConverter proporcionada.
Bean Validador
Se espera que los mensajes estén anotados con jakarta.validation anotaciones si deben ser validadas con el bean implementación del validador.
Bean la validación está disponible con el `BeanValidatorImpl`. Opcionalmente, toma un `jakarta.validation. Validator` representando el validador que se utilizará contra el cual todos los mensajes que pasen a través de este validador serán validados. Si no se proporciona un validador, se crea un validador predeterminado.
public BeanValidatorImpl() {
this(Validation.buildDefaultValidatorFactory().getValidator());
}
public BeanValidatorImpl(jakarta.validation.Validator validator) {
this(null, validator);
}
BeanValidatorImpl(String connectorName, jakarta.validation.Validator validator) {
this.connectorName = connectorName;
this.validator = validator;
}
La validación es opcional y puede ser habilitada proporcionando una implementación de BeanValidator al construir el conector.
receiveConnector = initiatingReceiveConnectorBuilder()
.withConnectorTransport(connectorTransport)
.withEventBus(eventBus)
.withBeanValidator(new BeanValidatorImpl<>()) (1)
.build();
| 1 | Agrega el bean validador al conector |