Я использую JAXB2 для выполнения OXM в Spring-WS. Указанный мной XSD требует, чтобы к сообщению мыла был прикреплен большой XML-файл, поэтому я использую MTOM для передачи файла и включил MTOM на моем JAXB2Marshaller.
Когда JAXB2 упорядочивает вложение MTOM, которое имеет ожидаемый тип mime text / xml, он доставляет этот элемент как объект javax.xml.transform.Source. После некоторого поиска я смог узнать, как я могу отправить этот объект Source в файл.
final Source source = request.getSource();
StreamSource streamSource = (StreamSource) source;
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
File file = new File ("/tempxmlfile.xml");
try{
transformer.transform(streamSource, new StreamResult(file));
LOG.info("File saved in "+file.getAbsolutePath());
}
catch(Exception ex){
ex.getMessage();
}
Проблема, с которой я столкнулся, заключается в том, что когда я отправляю файл в кодировке UTF-8 в качестве вложения, я получаю следующую ошибку:
[Fatal Error] :1:1: Content is not allowed in prolog.
ERROR: 'Content is not allowed in prolog.'
Это вызвано отметкой порядка байтов перед закодированным текстом в файле, хотя эта спецификация не требуется в файле с кодировкой UTF-8, она разрешена стандартом Unicode, Java не поддерживает спецификации в кодировке UTF-8. потоки.
Я могу решить эту проблему, отправив файл без спецификации, но на самом деле это невозможно, так как это вызовет проблемы с большинством продуктов Microsoft, которые вставляют спецификацию.
Существует множество обходных путей для отказа Sun / Oracle исправить эту проблему с помощью Streams, но все они требуют, чтобы вы имели доступ к Stream, исходный объект, предоставляемый JAXB2, не имеет InputStream, у него есть только объект Reader. Есть ли у меня способ решить эту проблему, либо обернув объект Sources Reader читателем, который знает, как игнорировать спецификацию в кодировке UTF-8, либо изменить способ, которым JAXB2 считывает вложение в источник, чтобы он мог игнорировать спецификация в кодировке UTF-8.
Заранее спасибо, Крейг