После многих дней поиска я обнаружил, что 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;
}