spring JAXBException:“包”不包含 ObjectFactory.class 或 jaxb.index
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/26642135/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JAXBException: "package" doesnt contain ObjectFactory.class or jaxb.index
提问by avi.elkharrat
I have been playing with JAXB / MOXy a lot lately, and it works great on all my tests and example codes. I exclusively using binding files, that's why I'm using MOXy.
我最近一直在玩 JAXB/MOXy,它在我所有的测试和示例代码中都运行良好。我只使用绑定文件,这就是我使用 MOXy 的原因。
Please note that in all my examples, I'm NEVER using an ObjectFactory nor a jaxb.index, and it works GREAT.
请注意,在我的所有示例中,我从不使用 ObjectFactory 或 jaxb.index,并且它运行良好。
When I get back to my business, I get a nasty JAXB Exception saying that my package does not contain an ObjectFactory or jaxb.index.
当我回到我的工作中时,我收到一个令人讨厌的 JAXB 异常,说我的包不包含 ObjectFactory 或 jaxb.index。
My project also invovles Spring and Hibernate, JUnit and DBUnit.
我的项目还涉及 Spring 和 Hibernate、JUnit 和 DBUnit。
Here is some sample code: I have an abstract class called AContributionPhysicalSupport.
下面是一些示例代码: 我有一个名为 AContributionPhysicalSupport 的抽象类。
package org.pea.openVillages.pojo.contribution.implementation;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
@Entity
@Table(name = "TOV_CONTRIBUTION_PHYSICAL_SUPPORT")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "SUPPORT_TYPE", discriminatorType = DiscriminatorType.STRING, length = 20)
public abstract class AContributionPhysicalSupport implements Serializable
{
/* *****************************************************************
*
* PROPERTIES
*
* *****************************************************************
*/
/**
* for Serializable
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "SUPPORT_ID")
private Long physicalSupportId;
@Column(name = "SUPPORT_TYPE", nullable = false, length = 20, updatable = false, insertable = false)
private String supportType;
/* *****************************************************************
*
* CONSTRUCTORS
*
* *****************************************************************
*/
public AContributionPhysicalSupport()
{
}
/* *****************************************************************
*
* GETTERS AND SETTERS
*
* *****************************************************************
*/
/**
* @return the physicalSupportId
*/
public Long getPhysicalSupportId()
{
return physicalSupportId;
}
/**
* @param physicalSupportId
* the physicalSupportId to set
*/
public void setPhysicalSupportId(Long physicalSupportId)
{
this.physicalSupportId = physicalSupportId;
}
/**
* @return the supportType
*/
public String getSupportType()
{
return supportType;
}
/**
* @param supportType
* the supportType to set
*/
public void setSupportType(String supportType)
{
this.supportType = supportType;
}
/* *****************************************************************
*
* UTILS
*
* *****************************************************************
*/
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
return this.getClass() + " [physicalSupportId=" + physicalSupportId + ", supportType=" + supportType + "]";
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((physicalSupportId == null) ? 0 : physicalSupportId.hashCode());
result = prime * result + ((supportType == null) ? 0 : supportType.hashCode());
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj == null)
{
return false;
}
if (!(obj instanceof AContributionPhysicalSupport))
{
return false;
}
AContributionPhysicalSupport other = (AContributionPhysicalSupport) obj;
if (physicalSupportId == null)
{
if (other.physicalSupportId != null)
{
return false;
}
}
else if (!physicalSupportId.equals(other.physicalSupportId))
{
return false;
}
if (supportType == null)
{
if (other.supportType != null)
{
return false;
}
}
else if (!supportType.equals(other.supportType))
{
return false;
}
return true;
}
}
Class Video inherits from AContributionPhysicalSupport :
Video 类继承自 AContributionPhysicalSupport :
package org.pea.openVillages.pojo.contribution.implementation;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name = "TOV_VIDEO")
@DiscriminatorValue("VIDEO")
public class Video extends AContributionPhysicalSupport
{
/* *****************************************************************
*
* PROPERTIES
*
* *****************************************************************
*/
/**
* for serializable
*/
private static final long serialVersionUID = 1L;
@Column(name = "VIDEO_TYPE", nullable = false, length = 20)
private String videoType;
@Column(name = "VIDEO_SIZE")
private Long videoSize;
@Column(name = "VIDEO_LENGTH")
private Long videoLength;
/* *****************************************************************
*
* CONSTRUCTORS
*
* *****************************************************************
*/
public Video()
{
super();
}
/* *****************************************************************
*
* GETTERS AND SETTERS
*
* *****************************************************************
*/
/**
* @return the videoType
*/
public String getVideoType()
{
return videoType;
}
/**
* @param videoType
* the videoType to set
*/
public void setVideoType(String videoType)
{
this.videoType = videoType;
}
/**
* @return the videoSize
*/
public Long getVideoSize()
{
return videoSize;
}
/**
* @param videoSize
* the videoSize to set
*/
public void setVideoSize(Long videoSize)
{
this.videoSize = videoSize;
}
/**
* @return the videoLength
*/
public Long getVideoLength()
{
return videoLength;
}
/**
* @param videoLength
* the videoLength to set
*/
public void setVideoLength(Long videoLength)
{
this.videoLength = videoLength;
}
/* *****************************************************************
*
* UTILS
*
* *****************************************************************
*/
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
return super.toString() + " Video [videoType=" + videoType + ", videoSize=" + videoSize + ", videoLength="
+ videoLength + "]";
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode()
{
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((videoLength == null) ? 0 : videoLength.hashCode());
result = prime * result + ((videoSize == null) ? 0 : videoSize.hashCode());
result = prime * result + ((videoType == null) ? 0 : videoType.hashCode());
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (!super.equals(obj))
{
return false;
}
if (!(obj instanceof Video))
{
return false;
}
Video other = (Video) obj;
if (videoLength == null)
{
if (other.videoLength != null)
{
return false;
}
}
else if (!videoLength.equals(other.videoLength))
{
return false;
}
if (videoSize == null)
{
if (other.videoSize != null)
{
return false;
}
}
else if (!videoSize.equals(other.videoSize))
{
return false;
}
if (videoType == null)
{
if (other.videoType != null)
{
return false;
}
}
else if (!videoType.equals(other.videoType))
{
return false;
}
return true;
}
}
Here is my binding file (there are other classes inheriting from AContributionPhysicalSupport....)
这是我的绑定文件(还有其他类继承自 AContributionPhysicalSupport....)
<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" package-name="org.pea.openVillages.pojo.contribution.implementation">
<java-types>
<java-type name="AContributionPhysicalSupport">
<xml-root-element name="contribution-physical-support" />
<xml-type prop-order="physicalSupportId supportType" />
<java-attributes>
<xml-attribute java-attribute="physicalSupportId" name="support-id" />
<xml-element java-attribute="supportType" name="support-type" />
</java-attributes>
</java-type>
<java-type name="ExternalFileFormat">
<xml-root-element name="ext-file-format" />
<xml-type prop-order="fileType fileSize" />
<java-attributes>
<xml-element java-attribute="fileType" name="file-type" />
<xml-element java-attribute="fileSize" name="file-size" />
</java-attributes>
</java-type>
<java-type name="InternalFileFormat">
<xml-root-element name="int-file-format" />
<xml-type prop-order="fileSize" />
<java-attributes>
<xml-element java-attribute="fileSize" name="file-size" />
</java-attributes>
</java-type>
<java-type name="Video">
<xml-root-element name="video" />
<xml-type prop-order="videoType videoSize videoLength" />
<java-attributes>
<xml-element java-attribute="videoType" name="video-type" />
<xml-element java-attribute="videoSize" name="video-size" />
<xml-element java-attribute="videoLength" name="video-length" />
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
And now my test :
现在我的测试:
@Test
public void testYATMarshal() throws Exception
{
Video toto = new Video();
toto.setPhysicalSupportId(new Long(1));
toto.setSupportType("VIDEO");
toto.setVideoLength(new Long(358));
toto.setVideoSize(new Long(5775));
toto.setVideoType("avi");
FileReader videoBindFile = new FileReader(
"src/main/resources/xml-mapping/ContributionImpl-binding.xml");
List<Object> videoBindList = new ArrayList<Object>();
videoBindList.add(videoBindFile);
Map<String, List<Object>> videoMetaMap = new HashMap<String, List<Object>>();
videoMetaMap.put("org.pea.openVillages.pojo.contribution.implementation", videoBindList);
Map<String, Object> videoProperties = new HashMap<String, Object>();
videoProperties.put(JAXBContextProperties.OXM_METADATA_SOURCE, videoMetaMap);
JAXBContext context = JAXBContext.newInstance("org.pea.openVillages.pojo.contribution.implementation",
Video.class.getClassLoader(), videoProperties);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(toto, System.out);
}
and last but not least the Exception :
最后但并非最不重要的 Exception :
javax.xml.bind.JAXBException: Provider com.sun.xml.internal.bind.v2.ContextFactory could not be instantiated: javax.xml.bind.JAXBException: "org.pea.openVillages.pojo.contribution.implementation" doesnt contain ObjectFactory.class or jaxb.index
- with linked exception:
[javax.xml.bind.JAXBException: "org.pea.openVillages.pojo.contribution.implementation" doesnt contain ObjectFactory.class or jaxb.index]
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:146)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:347)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:431)
at org.pea.openVillages.dao.service.impl.ContributionDAOImplTest.testYATMarshal(ContributionDAOImplTest.java:187)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.accessJAXBContext jc = JAXBContext.newInstance("com.example.pkg1:org.example.pkg2");
0(ParentRunner.java:42)
at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:184)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: javax.xml.bind.JAXBException: "org.pea.openVillages.pojo.contribution.implementation" doesnt contain ObjectFactory.class or jaxb.index
at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:216)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:172)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:132)
... 33 more
More info :
更多信息 :
- My test package (where I have my JUnit test class) contains a jaxb.properties file
- My JUnit test class is really a DBUnit / SpringJUnit class, since I want to marshal objects from a DB
- Marshalling from DB or marshalling a simple object (like shown in my example) generate the same Exception
- And, of course, adding a jaxb.index in the package doesn't change anything
- 我的测试包(我有我的 JUnit 测试类)包含一个 jaxb.properties 文件
- 我的 JUnit 测试类实际上是一个 DBUnit / SpringJUnit 类,因为我想从 DB 中编组对象
- 从 DB 编组或编组一个简单的对象(如我的示例中所示)生成相同的异常
- 而且,当然,在包中添加 jaxb.index 不会改变任何东西
Four eyes are better than two. I'm not getting what I'm doing wrong. If somebody sees it, please let me know.
四眼总比两眼好。我不明白我做错了什么。如果有人看到,请告诉我。
Cheers
干杯
采纳答案by lexicore
Provider com.sun.xml.internal.bind.v2.ContextFactory could not be instantiated- seems like you're not using MOXy but the built-in JAXB RI.
Provider com.sun.xml.internal.bind.v2.ContextFactory could not be instantiated- 似乎您没有使用 MOXy,而是使用内置的 JAXB RI。
Please check the following post by Blaise:
请查看 Blaise 的以下帖子:
See also the following question:
另请参阅以下问题:
Does MOXy need anything special when using with schema-derived classes?
回答by avi.elkharrat
The answer provided by Lexicore in his comment did it for me!
Lexicore 在他的评论中提供的答案为我做到了!
I have setted the two packages as shown in Blaise's answer:
我已经设置了两个包,如Blaise 的回答所示:
##代码##And that did it!
做到了!
Thx man
谢谢男人

