#java #xml #validation #annotations #jaxb
#java #xml #проверка #аннотации #jaxb
Вопрос:
Я пишу EJB в качестве службы SOAP первого контракта и генерирую классы Java и SEI из WSDL. WSDL определяет несколько типов с ограничениями (максимальная длина, шаблон и т.д.). Сгенерированные классы Java имеют аннотации JAXB, но им не хватает метаданных contrints, поскольку аннотации JAXB их не поддерживают. Это означает, что проверка ввода происходит только тогда, когда служба вызывается через конечную точку SOAP.
Проблема в том, что когда EJB вызывается другим EJB, проверка обходится, поскольку она находится в стеке XML. Я хотел бы отключить проверку схемы XML и вместо этого использовать проверку компонента, чтобы проверка работала для обоих способов (SOAP и RMI) вызова EJB.
Вопрос: Как я могу генерировать не только аннотации JAXB, но и аннотации проверки компонентов для классов Java?
Ответ №1:
Вы можете использовать javax.xml.valdation
API для проверки модели домена, сопоставленной с 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);
}
}
Полный пример
Комментарии:
1. И если я хочу отображать пользователю приятные сообщения проверки? Проверка Bean вернет полезные
ConstraintViolation
объекты, но средство проверки XML, похоже, довольствуется возвратом простой строки с предположительно очень техническим описанием ошибки?
Ответ №2:
Лучший ответ, который я знаю до сих пор, — это использовать плагин Annotate для добавления аннотаций JSR 303.
Ответ №3:
Вы можете генерировать аннотации проверки компонентов из xsd с помощью этого плагина https://github.com/krasa/krasa-jaxb-tools