Ответ 1
Вы можете сгенерировать Bean аннотации проверки от xsd с помощью этого плагина https://github.com/krasa/krasa-jaxb-tools
Я пишу EJB в качестве первой службы SOAP контракта, и я генерирую классы Java и SEI из WSDL. WSDL определяет несколько типов с ограничениями (максимальная длина, шаблон и т.д.). Сгенерированные классы Java являются JAXB аннотированными, но не содержат метаданных противопоказаний, поскольку аннотации JAXB не поддерживают их. Это означает, что проверка ввода происходит только тогда, когда служба вызывается через конечную точку SOAP.
Проблема заключается в том, что при вызове EJB другим EJB проверка исключается, поскольку она находится в стеке XML. Я хотел бы отключить XML Schemavalidation и использовать Bean Validation, поэтому проверка выполняется в обоих направлениях (SOAP и RMI) для вызова EJB.
Вопрос. Как я могу генерировать не только аннотации JAXB, но и Bean аннотации проверки на классы Java?
Вы можете сгенерировать Bean аннотации проверки от xsd с помощью этого плагина https://github.com/krasa/krasa-jaxb-tools
Вы можете использовать API-интерфейсы javax.xml.valdation
для проверки модели домена, сопоставленной с JAXB, с XML-схемой. Преимущество такого подхода заключается в том, что вы используете одни и те же правила валидации (определенные в схеме XML) для обоих ваших случаев использования:
import java.io.File;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.util.JAXBSource;
import javax.xml.validation.*;
public class Demo {
public static void main(String[] args) throws Exception {
Customer customer = new Customer();
customer.setName("Jane Doe");
customer.getPhoneNumbers().add(new PhoneNumber());
customer.getPhoneNumbers().add(new PhoneNumber());
customer.getPhoneNumbers().add(new PhoneNumber());
JAXBContext jc = JAXBContext.newInstance(Customer.class);
JAXBSource source = new JAXBSource(jc, customer);
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File("customer.xsd"));
Validator validator = schema.newValidator();
validator.setErrorHandler(new MyErrorHandler());
validator.validate(source);
}
}
Полный пример
Лучший ответ, который я знаю до сих пор, - использовать Annotate Plugin, чтобы добавить аннотации JSR 303.
Вы можете использовать MOXy версию 2.6+ как поставщик JAXB, и это будет сделано автоматически. MOXy является модулем в проекте EclipseLink.
На данный момент существует версия 2.6.0-M3 EclipseLink, доступная по адресу: sonatype или maven.