【问题标题】:Rewrite options in Context.xml file using Spring使用 Spring 重写 Context.xml 文件中的选项
【发布时间】:2013-05-05 20:27:14
【问题描述】:

我的项目中有Spring 配置。其中 context.xml 由我用 Java 动态重写。我的问题是,为什么重写文件后bean命名空间URL没有出现?

重写前我的 context.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2..xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd ">
<!-- <context:annotation-config /> -->

<bean class="org.springframework.ws.client.core.WebServiceTemplate" id="webServiceTemplate">
    <constructor-arg ref="messageFactory"/>
    <property name="marshaller" ref="xmlbeansMarshaller"/>
    <property name="unmarshaller" ref="xmlbeansMarshaller"/>
    <property name="defaultUri">
     <value>https://google.com</value></property>
</bean></beans>


我重写 context.xml 的 Java 代码:

DocumentBuilderFactory docFactory1 = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder1 = docFactory1.newDocumentBuilder();
Document doc1 = docBuilder1.parse(afilePath);

Node incIncident1 = doc1.getElementsByTagName("beans").item(0);

NodeList beanList = incIncident1.getChildNodes();

NodeList beanlist1 = beanList.item(25).getChildNodes();
List <Map<String, String>> aunitDetails = be.extendedData.get("uicdsDetails");
if (aunitDetails != null) {
    for (int i = 0; i < aunitDetails.size(); i++) {
        Map<String, String> unitLogDetails = aunitDetails.get(i);
        NodeList beanList2= beanlist1.item(7).getChildNodes();
        if (unitLogDetails.get("uURL") != null) {
            beanList2.item(0).setTextContent(unitLogDetails.get("uicdsURL"));
        } else {
            beanList2.item(0).setTextContent("https://google.com");
        }
        TransformerFactory transformerFactory1 = TransformerFactory.newInstance();
        Transformer transformer1 = transformerFactory1.newTransformer();
        System.out.println(doc);
        DOMSource source1 = new DOMSource(doc1);
        StreamResult result1 = new StreamResult(new File(afilePath));
        transformer1.transform(source1, result1);
    }
}


context.xml 被重写后:

<?xml version="1.0" encoding="UTF-8"?>
    <beans  
        xmlns:context="http://www.springframework.org/schema/context" 
        xmlns:util="http://www.springframework.org/schema/util" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2..xsd 
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd ">
    <!-- <context:annotation-config /> -->

    <bean class="org.springframework.ws.client.core.WebServiceTemplate" id="webServiceTemplate">

        <constructor-arg ref="messageFactory"/>
        <property name="marshaller" ref="xmlbeansMarshaller"/>
        <property name="unmarshaller" ref="xmlbeansMarshaller"/>
        <property name="defaultUri">
         <value>https://google.com</value></property>
    </bean>

</beans>


这里重写的 context.xml 文件缺少 XML 命名空间

xmlns="http://www.springframework.org/schema/beans"

为什么在重写时这个xmlns 不见了?

【问题讨论】:

    标签: java xml spring


    【解决方案1】:

    只是大声思考,使用上述代码重写 xml 文件的要求可能是什么。

    查看您的代码,您似乎想要更新 bean 的属性。 您不能简单地从上下文中获取 bean,根据您的业务逻辑更新其属性并进行上下文刷新!这应该让它保持简单,让你从你正在做的复杂事情中​​解脱出来。

    【讨论】:

      【解决方案2】:

      很久以前我玩 DOM 的时候,但尝试docFactory1.setNamespaceAware(true)(默认为false)或setAttributeNS("http://www.springframework.org/schema/beans", "xmlns")

      顺便说一句,为了获得帮助,请尽量减少您的问题。您的问题是使用 Java DOM 框架,它与 Spring 无关。你可以用 3 行来问这个问题,而不会产生任何噪音。

      【讨论】:

      • 感谢您的帮助。下次在病房我会跟着你的cmets
      • 别误会我,伙计,无意冒犯 :-) 用 3 行代码比用 100 行代码更容易理解问题;] 欢迎来到 SO --顺便说一句,这些解决方案有帮助吗?
      • @MadTech:请加一个帮助过你的人。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 2010-09-30
      • 2012-01-14
      相关资源
      最近更新 更多