Конфигурация Jaxb2Marshaller со многими файлами XSD не работает [JAVA 12] - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь создать автоматическую валидацию c XML весной с переопределением HttpMessageConverter. Я написал скрипт, который добавляет Jaxb2Marshaller Bean как MessagConverter в список WebMvcConfigurer конвертера. Но у меня проблема с моей Jaxb2Marshaller конфигурацией, когда я использовал много XSD-файлов в качестве схем. Spring распознает только объекты, связанные с первым файлом XSD. Это мой код маршаллера:

@Bean
public Jaxb2Marshaller jaxb2Marshaller() {
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setPackagesToScan("nbf.toto.core.xml");
    marshaller.setSchemas(new ClassPathResource("/xsd/file1.xsd"), new ClassPathResource("/xsd/file2.xsd"));
    Map<String, Object> map = new HashMap<>();
    map.put(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    map.put(Marshaller.JAXB_FRAGMENT, true);
    marshaller.setMarshallerProperties(map);

    return marshaller;
}

Существует пример кода, как установить много xsds в качестве схем для XML Проверка? Я использую Java 12, Srping 5 и Jaxb 2.3.2

1 Ответ

0 голосов
/ 09 марта 2020

После многих дней поиска я обнаружил, что Jaxb2Marshaller не разрешает проверку XSD на XML с разными тегами root. Поэтому, если у вас есть два разных XSD, связанных с разными сущностями, и вы добавляете эти XSD в bean-компонент Jaxb2Marshaller для проверки, Jaxb2Marshaller будет рассматривать только первый XSD-файл. И XML, связанный со вторым XSD, выдаст исключение.

Итак, для моей цели я создал XML утилиту Marshaller, чтобы преобразовать XML в данный класс XSD с проверкой. И в моем контроллере я получаю XML как String в @RequestBody. После того, как я конвертирую эту строку в данный класс XSD с помощью моего утилиты. Это пример метода, который я использовал:

public static Object convertXmlToClass(final String xmlContent, final Class classe, final String xsdFileName) throws Exception {

    final JAXBContext context = JAXBContext.newInstance(classe);
    final Unmarshaller unmarshaller = context.createUnmarshaller();

    try {
        final ClassPathResource xsdFile = new ClassPathResource("/xsd/" + xsdFileName + ".xsd");
        final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

        Schema schema = sf.newSchema(new StreamSource(xsdFile.getInputStream()));
        unmarshaller.setSchema(schema);
    } catch (Exception e) {
        LOG.error(e.getStackTrace());
        throw new Wy6Exception("An Error occured during the XML convertion.");
    }

    Object result = unmarshaller.unmarshal(new StreamSource(new ByteArrayInputStream(xmlContent.getBytes(StandardCharsets.UTF_8))));

    return result;
}
...