【问题标题】:Inject JAXBContext into spring将 JAXBContext 注入 spring
【发布时间】:2011-07-20 05:14:23
【问题描述】:

我正在尝试将JAXBContext 注入 Spring 应用程序上下文,通过:

<bean id="jaxbContext" class="javax.xml.bind.JAXBContext" factory-method="newInstance">
  <constructor-arg type="java.lang.Class" value="com.package.MyClassName"/>
</bean>

抛出异常:

找不到匹配的工厂方法:工厂方法'newInstance'

我也试试:

<bean id="jaxbContext" class="javax.xml.bind.JAXBContext" factory-method="newInstance">
  <constructor-arg type="java.lang.String" value="com.package"/>
</bean>

它会抛出一个异常:

javax.xml.bind.JAXBException:“com.package”不包含 ObjectFactory.class 或 jaxb.in​​dex 我确实在包“com.package”中放置了一个 jaxb.in​​dex 文件,并且文件中有一行“MyClassName”。

【问题讨论】:

  • 我可以通过 JAXBContext.newInstance(MyClassName.class); 实例化 JAXBContext但无法使用相同的方式注入它。

标签: spring jaxb code-injection


【解决方案1】:

@Tomasz 的答案是我推荐的解决方案,但是如果您想坚持使用 JAXBContext,那么您的第一个示例失败的原因是 static getInstance() method on JAXBContext 没有采用单个 Class 参数,它获取它们的可变参数列表。所以你需要注入一个列表,而不是一个类:

<bean id="jaxbContext" class="javax.xml.bind.JAXBContext" factory-method="newInstance">
  <constructor-arg value-type="java.lang.Class">
    <list>
       <value>com.package.MyClassName</value>
    </list>
  </constructor-arg>
</bean>

【讨论】:

  • 实际上 getInstance() 确实接受单个 Class 参数 (see docs),所以像 &lt;constructor-arg&gt;&lt;value type="java.lang.Class"&gt;com.package.MyClassName&lt;/value&gt;&lt;/constructor-arg&gt; 这样的东西也可以工作。
【解决方案2】:

你试过 Spring OXM 吗?最后一行很重要,命名空间仅供参考:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:oxm="http://www.springframework.org/schema/oxm"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-1.5.xsd">

    <oxm:jaxb2-marshaller id="marshaller" contextPath="com.package"/>
</beans>

8.4. XML Schema-based Configuration。你的类路径中还需要spring-oxm

【讨论】:

  • 嗨,托马斯。感谢你的回复。我使用的是 spring 2.5,它不支持 OXM。但这是使用spring 3.0的解决方案
  • 使用 oxm 命名空间的问题是我还没有找到注入 JAXBContext 属性的方法,例如用于使用自定义访问器来处理 Hibernate bean 并跳过惰性关系。
【解决方案3】:

这将解决 jaxb.in​​dex 文件的问题或 Spring env 中的 ObjectFactory 问题。提供生成 xml 的类所在的包的值

在此处输入代码`

    <bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="packagesToScan" >
            <value>com.adarsh.spring.integration.entities</value>
        </property>
   </bean>`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2015-03-29
    相关资源
    最近更新 更多