2017-05-11 11 views
4

オブジェクトのリストをXMLにマーシャリングしようとしています。以下 はメソッドです:jaxbマーシャリング時のjavax.xml.bind.PropertyException

import com.sun.xml.bind.marshaller.NamespacePrefixMapper; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 

public class ItemMarshaller 
{ 
    public String marshallItems(final List<Items> items) 
    { 
     try 
     { 
      final JAXBContext context = JAXBContext.newInstance("com.project.jaxb.items"); 
      final Marshaller m = context.createMarshaller(); 
      m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 

      m.setProperty("com.sun.xml.bind.namespacePrefixMapper", new NamespacePrefixMapper() 
      { 
       @Override 
       public String getPreferredPrefix(String uri, String suggestion, boolean requirePrefix) 
       { 
        return ""; 
       } 
      }); 

      final StringWriter writer = new StringWriter(); 
      m.marshal(items, writer); 

      return writer.toString(); 
     } 
     catch (final JAXBException e) 
     { 
      ErrorLogger.LOGGER.error("Marshalling failed.", e); //$NON-NLS-1$ 
     } 

     return null; 
    } 
} 

私は( "com.sun.xml.bind.namespacePrefixMapper"、新NamespacePrefixMapper()m.setPropertyを呼び出すと、私は次のエラーを取得する:

javax.xml.bind.PropertyException: name: com.sun.xml.bind.namespacePrefixMapper value: [email protected] 
at javax.xml.bind.helpers.AbstractMarshallerImpl.setProperty(AbstractMarshallerImpl.java:358) 
at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.setProperty(MarshallerImpl.java:527) 

内部クラスを使用する場合、 com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper;

代わりに、このプロジェクトは動作しますが、内部クラスです。また、abです内部のクラスを使用する広告のアイデア、または私は言われました。

どうすればこの問題を解決できますか?

答えて

1

オプション1: ではなくNamespacePrefixMapperクラスのpackage-info.javaファイルに注釈を使用します。

@javax.xml.bind.annotation.XmlSchema(
     namespace = "http://www.example.com/schema/impl", 
     elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, 
     xmlns={@XmlNs(prefix="ns0", namespaceURI="http://www.example.com/schema/impl")} 
    ) 
package com.abc.schema.impl; 

オプション2: 達人で、私は次の依存関係を構築する追加:

<!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl --> 
<dependency> 
    <groupId>com.sun.xml.bind</groupId> 
    <artifactId>jaxb-impl</artifactId> 
    <version>2.2.4-1</version> 
</dependency> 

これにより、使用しているJavaバージョンにcom.sun.xml.bind.marshaller.NamespacePrefixMapperを使用できます。

関連する問題