Я нашел много постов, в которых говорится об этой проблеме, но пока мне ничего не помогло. Я считаю, что упускаю что-то тривиальное, но я схожу с ума по этому поводу, поэтому, пожалуйста, помогите. Вот фрагменты моего кода:
Класс / узел root:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BulkDataRecord.Type", propOrder = {"transactionRecord"})
@XmlRootElement(name="bulkDataRecord", namespace = "http://www.imsglobal.org/services/lis/bdemsv1p0/imsbdemsFileData_v1p0")
public class BulkDataRecordType {
@XmlElement(required = true)
protected List<TransactionRecordType> transactionRecord;
public List<TransactionRecordType> getTransactionRecord() {
if (transactionRecord == null) {
transactionRecord = new ArrayList<TransactionRecordType>();
}
return this.transactionRecord;
}
}
Я создал класс расширения IpsisNamespaceMapper
public class IpsisNamespaceMapper extends NamespacePrefixMapper {
private static final String BDEMS_PREFIX = ""; // DEFAULT NAMESPACE
private static final String BDEMS_URI =
"http://www.imsglobal.org/services/lis/bdemsv1p0/imsbdemsFileData_v1p0 ";
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
System.out.println("CC IpsisNamespaceMapper.getPreferredPrefix namespaceUri, suggestion, requirePrefix: " + namespaceUri + "," + suggestion + "," + requirePrefix);
if(BDEMS_URI.equals(namespaceUri)) {
System.out.println("BDEMS_URI : "+BDEMS_URI +" BDEMS_PREFIX: " + BDEMS_PREFIX);
return BDEMS_PREFIX;
}
System.out.println("suggestion : " + suggestion);
return "mappedNamespace2"+suggestion;
}
@Override
public String[] getPreDeclaredNamespaceUris() {
return new String[] { BDEMS_URI };
}
}
Информация о пакете. java выглядит следующим образом:
{
@XmlSchema(namespace = "",
elementFormDefault = XmlNsForm.UNSET,
xmlns = @XmlNs(prefix = "", namespaceURI = "http://www.imsglobal.org/services/lis/bdemsv1p0/imsbdemsFileData_v1p0"))
package org.ccconline.externalspecs.imsglobal.lis2.bdems;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
}
часть маршалинга выглядит следующим образом:
JAXBContext context = JAXBContext.newInstance(BulkDataRecordType.class);
Marshaller marshaller = context.createMarshaller();
//marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new IpsisNamespaceMapper());
// Use a special writer class to ... TODO: Finish comments after you've got this thing working.
// marshaller.marshal(fileData, NoNamespaceXMLWriter.filter(info.getFileHandle()));
marshaller.marshal(fileData, info.getFileHandle());
Вывод выглядит следующим образом:
<bulkDataRecord xmlns:ns2="http://www.imsglobal.org/services/lis/bdemsv1p0/imsbdemsFileData_v1p0">
<transactionRecord>
<transactionOpIdentifier>replacePerson_20200412111543_1</transactionOpIdentifier>
<serviceName>pmsv2p0</serviceName>
<interfaceName>personmanager</interfaceName>
Я пробовал несколько изменений, но я не могу использовать ns2 в xmlns: ns2
Я ценю вашу помощь! ! Спасибо, Джалал!