Java Jersey:marsheling和unmarsheling其他xml中的xml

Java Jersey:marsheling和unmarsheling其他xml中的xml,java,xml,jaxb,jersey,marshalling,Java,Xml,Jaxb,Jersey,Marshalling,问题的本质简要说明: 1) 如何在Jersey中的其他xml中双关一个应该由CDATA包装的xml 2) 在编组过程中,如何避免将“转换为” 更多详细信息: 我需要将XML发送到外部服务器 此XML应采用以下格式: <root> <element1>some value</element1> <element2> <![CDATA[<?xml version="1.0" encoding="UTF-8" ?>

问题的本质简要说明:

1) 如何在Jersey中的其他xml中双关一个应该由CDATA包装的xml

2) 在编组过程中,如何避免将转换为

更多详细信息:

我需要将XML发送到外部服务器

此XML应采用以下格式:

<root>
   <element1>some value</element1>
   <element2>
      <![CDATA[<?xml version="1.0" encoding="UTF-8" ?>
      <innerXlmElement>
         <item>
            <itemElement1>1</itemElement1>
            <itemElement2>1</itemElement2>
         </item>
         ...
         <item>
            <itemElement1>n</itemElement1>
            <itemElement2>n</itemElement2>
         </item>
      </innerXlmElement>]]>
   </element2>
</root>
生成的XML在请求期间已发送到外部服务器,如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
   <element1>3324</element1>
   <element2>
      <innerXlmElement>
         <item>
            <itemElement1>1</itemElement1>
            <itemElement2>2</itemElement2>
         </item>
      </innerXlmElement>
   </element2>
</root>
然后我自己实现了DomHandler:

我将断点放在我的处理程序中的所有方法上,其中没有一个方法不起作用

如果我删除@XmlAnyElement注释,一切都会好起来(当然,除了Jersey会发送错误的带有“<;”和“>;”转义的XML)

------更新(15.01.14)--------

我删除了Jersey并发现根异常:

javax.xml.bind.MarshalException
 - with linked exception:
[com.sun.istack.internal.SAXException2: unable to marshal type "java.lang.String" as an element because it is missing an @XmlRootElement annotation]

将JAXB默认实现更改为MOXy解决了这个问题


好的,我想,我可以删除我的问题,因为我在调查我的问题时遇到的所有问题,已经在其他几个问题上得到了回答。

的角度来看,内容只是一个字符串,碰巧是一个XML文档。如果您真的必须将其格式化为CDATA节,那么这有很多可能的解决方案。我尝试过的@BlaiseDoughan的可能副本。但就这样,Jersey开始抛出异常(javax.ws.rs.ProcessingException:HTTP500内部服务器错误)。如果您能告诉我可能存在的问题或我应该寻找的方法,我将不胜感激。
Req req = new Req();
req.setElement1("some value");
StringBuilder element2= new StringBuilder();
xmlServiceInfo.append("<![CDATA[<?xml version=\"1.0\" encoding=\"UTF-8\" ?><innerXlmElement><item><itemElement1>1</itemElement1><itemElement2>2</itemElement2></item></innerXlmElement>]]>");
req.setElement1(element2.toString());
...
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
   <element1>some value</element1>
   <element2>
      &lt;![CDATA[&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;&lt;innerXlmElement&gt;&lt;item&gt;&lt;itemElement1&gt;1&lt;/itemElement1&gt;&lt;itemElement1&gt;2&lt;/itemElement2&gt;&lt;/item&gt;&lt;/innerXlmElement&gt;]]&gt;
   </element2>
</root>
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "root")
public class Req {

   protected String element1;
   protected String element2;

   @XmlElement(name = "element1")
   public String getElement1() {
      return element1;
   }

   public void setElement1(String element1) {
      this.element1 = element1;
   }

   @XmlAnyElement(value=CDATAHandler.class)
   public String getElement2() {
      return element2;
   }

   public void setElement2(String element2) {
      this.element2 = element2;
   }
public class CDATAHandler implements DomHandler<String, StreamResult> {

  private static final String START_TAG = "<![CDATA[<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
  private static final String END_TAG = "]]>";

  private StringWriter xmlWriter = new StringWriter();

  public StreamResult createUnmarshaller(ValidationEventHandler errorHandler) {
     return new StreamResult(xmlWriter);
  }

  public String getElement(StreamResult rt) {
     String xml = rt.getWriter().toString();
     int beginIndex = xml.indexOf(START_TAG) + START_TAG.length();
     int endIndex = xml.indexOf(END_TAG);
     return xml.substring(beginIndex, endIndex);
  }

  public Source marshal(String n, ValidationEventHandler errorHandler) {
     try {
        String xml = START_TAG + n.trim() + END_TAG;
        StringReader xmlReader = new StringReader(xml);
        return new StreamSource(xmlReader);
     } catch(Exception e) {
        throw new RuntimeException(e);
     }
  }
}
org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:226)
org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:655)
org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:652)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:228)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:422)
org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:652)
org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:412)
action.BaseExecutor.execute(BaseExecutor.java:42) [my method, where I invoke Jersey]
...
javax.xml.bind.MarshalException
 - with linked exception:
[com.sun.istack.internal.SAXException2: unable to marshal type "java.lang.String" as an element because it is missing an @XmlRootElement annotation]