javax.xml.bind.UnmarshalException - 带有链接异常:[org.xml.sax.SAXParseException:prolog 中不允许内容。]
Posted
技术标签:
【中文标题】javax.xml.bind.UnmarshalException - 带有链接异常:[org.xml.sax.SAXParseException:prolog 中不允许内容。]【英文标题】:javax.xml.bind.UnmarshalException - with linked exception: [org.xml.sax.SAXParseException: Content is not allowed in prolog.] 【发布时间】:2012-11-19 02:12:33 【问题描述】:Customer.java
@Entity
@Table(name = "CUSTOMER", uniqueConstraints =
@UniqueConstraint(columnNames =
"CUSTNO"
)
)
@XmlRootElement
public class Customer
implements Serializable
/**
*
*/
private static final long serialVersionUID = 1L;
@Id @Column(name = "CUSTNO", length = 10, nullable = false) private String custNo;
@Column(name = "TITLE", length = 20, nullable = false) private String title;
@Column(name = "FIRSTNAME", length = 20, nullable = false) private String
firstName;
@Column(name = "MIDINIT", length = 1, nullable = true) private String
midInit;
@Column(name = "LASTNAME", length = 1, nullable = false) private String
lastName;
@Column(name = "EMAIL", length = 50, nullable = false) private String
email;
@Column(name = "PHONE", length = 16, nullable = true) private String
phone;
@Column(name = "GENDER", length = 1, nullable = true) private String
gender;
@Column(name = "STREETADDRESS", length = 50, nullable = true) private String
streetAddress;
@Column(name = "CITY", length = 20, nullable = true) private String
city;
@Column(name = "STATE", length = 2, nullable = true) private String
state;
@Column(name = "ZIPCODE", length = 10, nullable = true) private String
zipCode;
@Column(name = "COMPANYNAME", length = 25, nullable = true) private String
companyName;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "customer") private Set<ServiceRequest>
requests;
public Customer()
...... getters/setters....
客户端代码:
byte[] getCustomerResponse = (byte[])
RestClientUtil.sendGetMethod(urlGetCustomer + URLEncoder.encode(custNo, "UTF-8"));
Unmarshaller unmarshaller = RestClientUtil.getUnmarshaller(Customer.class);
StringReader reader = new StringReader(new String(getCustomerResponse));
Customer customer = (Customer) unmarshaller.unmarshal(reader);
我看到输出为:
found customer :"customer":"city":"city1 ","companyName":"companyName1 ","custNo":"RCN1","email":"email1@ge.com","firstName":"first1 ","gender":"F","lastName":"last1 ","midInit":"K","phone":"4082229871 ","state":"CA","streetAddress":"streetAddress1","title":"S ","zipCode":"zipCode "
javax.xml.bind.UnmarshalException - 有关联的例外: [org.xml.sax.SAXParseException:序言中不允许内容。] 在 javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315) 在 com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:526) 在 com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:223) 在 com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:189) 在 javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137) 在 javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:194) 在 com.ge.dsp.iworkRemote.remoteAgents.CustomerRemoteAgent.getCustomerByCustNo(CustomerRemoteAgent.java:151) 在 com.ge.dsp.iworkRemote.remoteAgents.CustomerRemoteAgent.execute(CustomerRemoteAgent.java:311) 在 com.ge.dsp.iworkRemote.remoteAgents.CustomerRemoteAgent.main(CustomerRemoteAgent.java:368) 原因:org.xml.sax.SAXParseException:prolog 中不允许内容。 在 org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(未知来源) 在 org.apache.xerces.util.ErrorHandlerWrapper.fatalError(未知来源) 在 org.apache.xerces.impl.XMLErrorReporter.reportError(未知来源) 在 org.apache.xerces.impl.XMLErrorReporter.reportError(未知来源) 在 org.apache.xerces.impl.XMLScanner.reportFatalError(未知来源) 在 org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(未知来源) 在 org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(未知来源) 在 org.apache.xerces.parsers.XML11Configuration.parse(未知来源) 在 org.apache.xerces.parsers.XML11Configuration.parse(未知来源) 在 org.apache.xerces.parsers.XMLParser.parse(未知来源) 在 org.apache.xerces.parsers.AbstractSAXParser.parse(未知来源) 在 org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(未知来源) 在 com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:217) ... 6 更多 java.lang.NullPointerException 在 com.ge.dsp.iworkRemote.remoteAgents.CustomerRemoteAgent.submitRequest(CustomerRemoteAgent.java:167) 在 com.ge.dsp.iworkRemote.remoteAgents.CustomerRemoteAgent.execute(CustomerRemoteAgent.java:313) 在 com.ge.dsp.iworkRemote.remoteAgents.CustomerRemoteAgent.main(CustomerRemoteAgent.java:368)
【问题讨论】:
new String(byte[])
几乎肯定是错误的——从字节数组构造字符串时,您应该始终指定字符编码。或者在这种情况下,将 byte[]
包装在 ByteArrayInputStream
中并从中解组,而不是使用字符串。
【参考方案1】:
注意:我是EclipseLink JAXB (MOXy) 领导,也是JAXB (JSR-222) 专家组的成员。
JAXB (JSR-222) 规范不包括 JSON 绑定。当 JAXB 注释模型与 JAX-RS 实现一起使用时,会出现超出 JAXB 规范的处理。这就是为什么当您尝试使用标准 JAXB API 来处理 JSON 消息时会收到 XML 解析器异常。
演示
EclipseLink MOXy 是一个 JAXB 实现,它提供对 JSON 绑定的本机支持(请参阅:http://blog.bdoughan.com/2011/08/json-binding-with-eclipselink-moxy.html)。以下是使用您的问题中发布的域模型的示例(添加了访问器)
package forum13652303;
import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo
public static void main(String[] args) throws Exception
Map<String, Object> properties = new HashMap<String, Object>(1);
properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
JAXBContext jc = JAXBContext.newInstance(new Class[] Customer.class, properties);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File json = new File("src/forum13652303/input.json");
Customer customer = (Customer) unmarshaller.unmarshal(json);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, System.out);
jaxb.properties
要将 MOXy 用作您的 JAXB 提供程序,您需要在与域模型相同的包中添加一个名为 jaxb.properties
的文件,并使用以下条目(请参阅:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html):
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
input.json/Output
"customer" :
"city" : "city1 ",
"companyName" : "companyName1 ",
"custNo" : "RCN1",
"email" : "email1@ge.com",
"firstName" : "first1 ",
"gender" : "F",
"lastName" : "last1 ",
"midInit" : "K",
"phone" : "4082229871 ",
"state" : "CA",
"streetAddress" : "streetAddress1",
"title" : "S ",
"zipCode" : "zipCode "
【讨论】:
以上是关于javax.xml.bind.UnmarshalException - 带有链接异常:[org.xml.sax.SAXParseException:prolog 中不允许内容。]的主要内容,如果未能解决你的问题,请参考以下文章