spring - JAXBException : "package" doesnt contain ObjectFactory. 类或 jaxb.in​​dex

标签 spring hibernate jaxb moxy dbunit

我最近一直在玩 JAXB/MOXy,它适用于我所有的测试和示例代码 .我专门使用绑定(bind)文件,这就是我使用 MOXy 的原因。

请注意,在我的所有示例中,我从不使用 ObjectFactory 或 jaxb.in​​dex,效果很好 .

当我回到我的业务时,我收到一个令人讨厌的 JAXB 异常,说我的包不包含 ObjectFactory 或 jaxb.in​​dex。

我的项目还涉及 Spring 和 Hibernate、JUnit 和 DBUnit。

下面是一些示例代码: 我有一个名为 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;
}
}

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;
}

}

这是我的绑定(bind)文件(还有其他类继承自 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>

现在我的测试:
@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);
}

最后但并非最不重要的异常(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$1.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$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.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

更多信息 :
  • 我的测试包(我有我的 JUnit 测试类)包含一个 jaxb.properties 文件
  • 我的 JUnit 测试类实际上是一个 DBUnit/SpringJUnit 类,因为我想从 DB
  • 编码对象
  • 从 DB 编码或编码一个简单对象(如我的示例所示)会生成相同的异常
  • 当然,在包中添加 jaxb.in​​dex 并不会改变任何内容

  • 四眼胜过两只。我不明白我做错了什么。如果有人看到,请告诉我。

    干杯

    最佳答案

    Provider com.sun.xml.internal.bind.v2.ContextFactory could not be instantiated - 好像你没有使用 MOXy 而是内置的 JAXB RI。

    请查看 Blaise 的以下帖子:

    Specifying EclipseLink MOXy as Your JAXB Provider



    另请参阅以下问题:

    Does MOXy need anything special when using with schema-derived classes?

    关于spring - JAXBException : "package" doesnt contain ObjectFactory. 类或 jaxb.in​​dex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26642135/

    相关文章:

    java - 测试 Spring 批量作业步骤范围

    java - hibernate 锁定表

    java - 当数据包含不可显示的字符时,JAXB 输出无效的 XML

    java - 对 Hibernate(和 JPA)标准的表达能力的限制?

    jaxb - 注释向元素添加属性

    java - 使用 IDResolver 时解码 JAXB 集合失败,因为 IDResolver 对象作为目标类型

    java - Controller 和 Wicket 页面的设计模式帮助

    java - 任务 ';checkDebugManifest'的配置出错

    java - 如何配置spring应用的多个实现

    java - 无法在 hibernate 中删除 OneToMany 关系的实例