相关疑难解决方法(0)

javax.xml.bind.UnmarshalException:意外元素.预期要素是(无)

我正在解决这个错误,同时解组一个字符串.我使用JAXB创建了Java文件.

JAXBContext jaxbContext = JAXBContext.newInstance(DocumentType.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
// Input string posted below
DocumentType dType = (DocumentType) unmarshaller.unmarshal(new StringReader("input string"));
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd", local:"document"). Expected elements are (none)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:647)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:243)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:238)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:105)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1048)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:483)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:465)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:135)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:506)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:376)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:602)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3065)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:881)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:489)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:203)
    at …
Run Code Online (Sandbox Code Playgroud)

java jaxb unmarshalling

57
推荐指数
2
解决办法
9万
查看次数

无法将类型编组为元素,因为它缺少自动生成的类的@XmlRootElement注释

我需要针对我的模式验证Class对象,在该模式中我提供了正则表达式来验证自动生成的JAXB类的字段.当我尝试验证我的类对象时,我得到以下错误:

无法编组类型"xyz"作为元素,因为它缺少@XmlRootElement注释

这是我用来验证自动生成的类对象的代码:

jc = JAXBContext.newInstance(obj.getClass());
source = new JAXBSource(jc, obj);
Schema schema = schemaInjector.getSchema();
Validator validator = schema.newValidator();
validator.validate(source);
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以解决这个问题吗?

java schema jaxb java-ee

39
推荐指数
3
解决办法
7万
查看次数

如何在XSD中为基类型生成@XmlRootElement类?

我在使用XJC从XSD生成具有适当JAXB注释的Java类时遇到一些问题.

我有一个相对简单的XSD文件来定义我的XML模式.XSD中的复杂类型利用<xs:extension>标记继承.我遇到的问题是我需要所有复杂的类型来生成Java类@XmlRootElement.

不幸的是,XJC生成类的方式意味着只有派生类才能获得@XmlRootElement(而不是基类).我使用简单的全局绑定指令来确保它解决了我在XJC面临的许多其他问题.

以下是XSD的示例代码段:

<xs:schema version="1.0" targetNamespace="http://www.knowledgemill.com/kmcs"
  xmlns:kmcs="http://www.knowledgemill.com/kmcs"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
  jaxb:version="2.0"
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  jaxb:extensionBindingPrefixes="xjc"
  elementFormDefault="qualified">
    <xs:annotation>
        <xs:appinfo>
            <jaxb:globalBindings>
                <xjc:simple />
            </jaxb:globalBindings>
        </xs:appinfo>
    </xs:annotation>

    <xs:element name="Artifact" type="kmcs:Artifact"/>
    <xs:element name="EmailArtifact" type="kmcs:EmailArtifact"/>

    <xs:complexType name="Artifact">
        <xs:sequence>
            <xs:element name="artifactId" type="xs:string" minOccurs="0"/>
            <xs:element name="artifactType" type="xs:string" minOccurs="0"/>
            <xs:element name="contentHash" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="EmailArtifact">
        <xs:complexContent>
            <xs:extension base="kmcs:Artifact">
                <xs:sequence>
                    <xs:element name="subject" type="xs:string" minOccurs="0"/>
                    <xs:element name="threadSubject" type="xs:string" minOccurs="0"/>
                    <xs:element name="from" type="xs:string" minOccurs="0"/>
                    <xs:element name="to" type="xs:string" minOccurs="0"/>
                    <xs:element name="cc" type="xs:string" minOccurs="0"/>
                    <xs:element name="bcc" type="xs:string" …
Run Code Online (Sandbox Code Playgroud)

java xsd jaxb xjc

25
推荐指数
2
解决办法
6万
查看次数

使用纯JAX-WS添加SOAP头对象

我正在尝试使用JAX WSPayPal Express Checkout API实现简单的Web服务客户端.PayPal Express Checkout API提供了WSDL文件,我可以使用CXF的wsdl2java实用程序从中生成Java类.

出于身份验证原因,它需要为每个请求添加SOAP Header.这个标题非常简单,应该如下所示:https: //cms.paypal.com/us/cgi-bin/?cmd = __render-content&content_ID = developer/e_howto_api_ECSOAPAPasics #id09C3I0CF0O6

WSDL类生成的包括ebay.apis.eblbasecomponents.CustomSecurityHeaderType类,它表示我需要添加到每个请求的标头.

所以问题是:如何考虑以下条件,将手动创建的CustomSecurityHeaderType类实例添加到SOAP请求的标题中:

  1. 我不是非常渴望使用com.sun.*包中的类,如答案中所述:JAX-WS - 添加SOAP标头(主要是因为不同JDK之间可能的可移植性问题)
  2. 我不想手动将该对象编组到嵌套的 javax.xml.soap.SOAPElement实例中,如下面的答案所述: 如何使用Java JAX-WS添加SOAP Header

soap web-services paypal jax-ws webservice-client

19
推荐指数
3
解决办法
7万
查看次数

如何获取XmlType的String表示?

是否可以将javax.xml.bind.annotation.XmlType转换为XML的String表示形式?

例:

以下类Req来自第三方库,因此我无法覆盖toString()方法.

@javax.xml.bind.annotation.XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.FIELD)
@javax.xml.bind.annotation.XmlType(name = "req", propOrder = {"myDetails", "customerDetails"})
public class Req  {
...
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我想简单地获取XML的String表示,以便我可以将其记录到文件中:

<Req>
    <MyDetails>
    ...
    </MyDetails>
    <CustomerDetails>
    ...
    </CustomerDetails>
</Req>
Run Code Online (Sandbox Code Playgroud)

当我尝试使用JAXB和Marshall转换为XML String时:

JAXBContext context = JAXBContext.newInstance(Req.class);
Marshaller marshaller = context.createMarshaller();
StringWriter sw = new StringWriter();
marshaller.marshal(instanceOfReq, sw);
String xmlString = sw.toString();
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

javax.xml.bind.MarshalException
    - with linked exception:
    [com.sun.istack.SAXException2: unable to marshal type "mypackage.Req" as an element because it is missing an @XmlRootElement annotation]
Run Code Online (Sandbox Code Playgroud)

我查看了第三方库中的其他类,但没有一个使用@XmlRootElement注释.有什么方法吗?

java xml jaxb

17
推荐指数
2
解决办法
2万
查看次数

Jaxb:我如何生成ObjectFactory类?

我正在使用Java 6,JaxB 2和SpringSource Tool Suite(与Eclipse相同).我有几个我编写的Java类,我从中使用JaxB生成XML模式.但是,我注意到为了使用JaxB从Java对象生成XML文档的能力,我需要一个ObjectFactory.

final Marshaller marshaller = jaxbContext.createMarshaller();
// Here is where I don't have an ObjectFactory defined
final JAXBElement<WebLeads> webLeadsElement  
         = (new ObjectFactory()).createWebLeads(webLeadsJavaObj);
Run Code Online (Sandbox Code Playgroud)

如何在不吹走现有类的情况下生成ObjectFactory?

java jaxb jaxb2

7
推荐指数
1
解决办法
3万
查看次数

从wsdl创建客户端时缺少@XmlRootElement

我有一个关于使用基于第三方wsdl文件的Web服务的问题.

我已经采用了给定的wsdl并生成了所需的120多个java文件.这个过程是通过使用xjc完成的.在Sping环境中,我能够通过调用几个公开的服务来成功创建几个JUnit测试.

但是,为了成功测试这些服务,我必须将@XmlRootElement注释添加到生成的java文件中.否则,我会遇到一个错误说明

"com.sun.istack.SAXException2:无法编组类型"com.beam.services.client.UserGetRequestData"作为元素,因为它缺少@XmlRootElement注释"

.

我已经用尽了我的搜索...我无法控制如何创建/结构化wsdl文件.如何生成java文件以确保包含@XmlRootElement注释,或者以编写客户端代码的方式避免上述错误?

谢谢.

spring webservice-client spring-annotations

6
推荐指数
1
解决办法
9864
查看次数

无法将类型编组为XML元素,因为缺少@XmlRootElement注释

我想将对象编组为XML.

但是,它失败,但有例外:

javax.xml.bind.MarshalException
 - with linked exception:
[com.sun.istack.SAXException2: unable to marshal type "FreightOfferDetail" as an element because it is missing an @XmlRootElement annotation]
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:331)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:257)
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:96)
    at com.wktransportservices.fx.test.util.jaxb.xmltransformer.ObjectTransformer.toXML(ObjectTransformer.java:27)
    at com.wktransportservices.fx.test.sampler.webservice.connect.FreightOfferToConnectFreight.runTest(FreightOfferToConnectFreight.java:59)
    at org.apache.jmeter.protocol.java.sampler.JavaSampler.sample(JavaSampler.java:191)
    at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:429)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:257)
    at java.lang.Thread.run(Thread.java:662)
Caused by: com.sun.istack.SAXException2: unable to marshal type "FreightOfferDetail" as an element because it is missing an @XmlRootElement annotation
    at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:244)
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:303)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:490)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:328)
Run Code Online (Sandbox Code Playgroud)

实际上,这个注释存在(对于父类和交付类):

@XmlRootElement(name = "Freight_Offer")
@XmlAccessorType(XmlAccessType.FIELD)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class FreightOffer { …
Run Code Online (Sandbox Code Playgroud)

java xml jaxb marshalling

6
推荐指数
2
解决办法
3万
查看次数

从 Spring Boot 控制器返回 JAXB 生成的元素

我正在从http://www.ncpdp.org的 XSD 文件生成大量 Java 文件(仅对会员可用)。生成它们后,我想在 Spring 控制器中使用它们,但在将响应转换为 XML 时遇到问题。

我尝试返回元素本身以及 JAXBElement<T>,但似乎都不起作用。下面的测试失败:

java.lang.AssertionError: Status 
Expected :200
Actual   :406

@Test
public void testHelloWorld() throws Exception {
    mockMvc.perform(get("/api/message")
            .accept(MediaType.APPLICATION_XML)
            .contentType(MediaType.APPLICATION_XML))
            .andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_XML));
}
Run Code Online (Sandbox Code Playgroud)

这是我的控制器:

import org.ncpdp.schema.transport.MessageType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {

    @RequestMapping(value = "/api/message", method = RequestMethod.GET)
    public MessageType messageType() {
        return new MessageType();
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试创建一个 MvcConfig 来覆盖 Spring Boot 的 MVC 配置,但它似乎不起作用。

@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> …
Run Code Online (Sandbox Code Playgroud)

spring spring-mvc jaxb2 spring-boot

5
推荐指数
1
解决办法
9148
查看次数

在Java中基于XSD创建XML

我需要在Java中生成基于XSD模板的XML文件,我可以解析XSD文件,但解析后不知道,热生成XML文件.你知道怎么做的例子或建议吗?我对此并不是很专家,所以我感谢任何帮助.

提前谢谢了.

java xml xsd

0
推荐指数
1
解决办法
4172
查看次数