복붙노트

[SPRING] XML을 받아들이는 Spring 용 PropertyPlaceholderConfigurer와 같은 클래스가 있습니까?

SPRING

XML을 받아들이는 Spring 용 PropertyPlaceholderConfigurer와 같은 클래스가 있습니까?

Spring은 PropertyPlaceholderConfigurer라는 매우 편리한 편리한 클래스를 가지고있다. PropertyPlaceholderConfigurer는 표준 .properties 파일을 받아 bean.xml 설정에 값을 주입한다.

누구나 똑같은 일을하고 같은 방식으로 Spring과 통합하지만 설정을위한 XML 파일을 허용하는 클래스를 아는 사람이 있습니까? 특히, 나는 아파치 digester 스타일의 설정 파일을 생각하고있다. 이 작업을 수행하기는 쉽지만, 이미 누군가가 있는지 궁금합니다.

제안?

해결법

  1. ==============================

    1.방금 테스트했는데 제대로 작동해야합니다.

    방금 테스트했는데 제대로 작동해야합니다.

    PropertiesPlaceholderConfigurer에는 setPropertiesPersister 메소드가 포함되어 있으므로 PropertiesPersister의 고유 서브 클래스를 사용할 수 있습니다. 기본 PropertiesPersister는 XML 형식의 특성을 이미 지원합니다.

    단지 당신에게 완벽한 코드를 보여주기 위해서 :

    JUnit 4.4 테스트 케이스 :

    package org.nkl;
    
    import static org.junit.Assert.assertEquals;
    import static org.junit.Assert.assertNotNull;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @ContextConfiguration(locations = { "classpath:/org/nkl/test-config.xml" })
    @RunWith(SpringJUnit4ClassRunner.class)
    public class PropertyTest {
    
        @Autowired
        private Bean bean;
    
        @Test
        public void testPropertyPlaceholderConfigurer() {
            assertNotNull(bean);
            assertEquals("fred", bean.getName());
        }
    }
    

    봄 설정 파일 test-config.xml

    <?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:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd
    ">
      <context:property-placeholder 
          location="classpath:/org/nkl/properties.xml" />
      <bean id="bean" class="org.nkl.Bean">
        <property name="name" value="${org.nkl.name}" />
      </bean>
    </beans>
    

    XML properties 파일 properties.xml - 사용법에 대한 설명은 여기를 참조하십시오.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
      <entry key="org.nkl.name">fred</entry>
    </properties>
    

    그리고 마지막으로 콩 :

    package org.nkl;
    
    public class Bean {
        private String name;
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
    }
    

    희망이 도움이 ...

  2. ==============================

    2.Spring 모듈은 Spring과 Commons Configuration 사이의 통합을 제공하는 것으로 밝혀졌습니다. Spring과 Commons Configuration은 계층 적 XML 구성 스타일을 가지고 있습니다. 이렇게하면 PropertyPlaceholderConfigurer가 바로 연결됩니다.

    Spring 모듈은 Spring과 Commons Configuration 사이의 통합을 제공하는 것으로 밝혀졌습니다. Spring과 Commons Configuration은 계층 적 XML 구성 스타일을 가지고 있습니다. 이렇게하면 PropertyPlaceholderConfigurer가 바로 연결됩니다.

  3. ==============================

    3.이것에 대한 좋은 해결책을 생각해 내려고 노력했습니다.

    이것에 대한 좋은 해결책을 생각해 내려고 노력했습니다.

    제가 생각해 낸 것은 아래와 같습니다, 사과는 꽤 오래되었습니다.하지만 모든 것을 다 다루고 있다고 믿기 때문에 해결책으로 생각합니다. 바라기를 이것은 누군가에게 유용 할 것입니다. 사소한 부분 먼저 :

    빈에 등록 된 속성 값을 원한다.

    package com.ndg.xmlpropertyinjectionexample;
    
    public final class MyBean
    {
        private String firstMessage;
        private String secondMessage;
    
        public final String getFirstMessage ()
        {
            return firstMessage;
        }
    
        public final void setFirstMessage (String firstMessage)
        {
            this.firstMessage = firstMessage;
        }
    
        public final String getSecondMessage ()
        {
            return secondMessage;
        }
    
        public final void setSecondMessage (String secondMessage)
        {
            this.secondMessage = secondMessage;
        }
    }
    

    위의 빈을 생성하고 그것이 가지고있는 속성 값을 덤프하도록 테스트 클래스 :

    package com.ndg.xmlpropertyinjectionexample;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public final class Main
    {
        public final static void main (String [] args)
        {
            try
            {
                final ApplicationContext ctx = new ClassPathXmlApplicationContext ("spring-beans.xml");
                final MyBean bean = (MyBean) ctx.getBean ("myBean");
                System.out.println (bean.getFirstMessage ());
                System.out.println (bean.getSecondMessage ());
            }
            catch (final Exception e)
            {
                e.printStackTrace ();
            }
        }
    
    }
    

    MyConfig.xsd :

    <?xml version="1.0" encoding="UTF-8"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:myconfig="http://ndg.com/xmlpropertyinjectionexample/config" targetNamespace="http://ndg.com/xmlpropertyinjectionexample/config">
    
        <xsd:element name="myConfig">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element minOccurs="1" maxOccurs="1" name="someConfigValue" type="xsd:normalizedString" />
                    <xsd:element minOccurs="1" maxOccurs="1" name="someOtherConfigValue" type="xsd:normalizedString" />
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
    
    </xsd:schema>
    

    XSD를 기반으로 MyConfig.xml 파일 샘플 :

    <?xml version="1.0" encoding="UTF-8"?>
    <config:myConfig xmlns:config="http://ndg.com/xmlpropertyinjectionexample/config">
        <someConfigValue>First value from XML file</someConfigValue>
        <someOtherConfigValue>Second value from XML file</someOtherConfigValue>
    </config:myConfig>
    

    xsd2java를 실행하기위한 pom.xml 파일의 스 니펫 (Java 1.6으로 설정하고 스프링 컨텍스트 종속성을 설정하는 것 외에는 그다지 많지 않습니다.)

            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <executions>
                    <execution>
                        <id>main-xjc-generate</id>
                        <phase>generate-sources</phase>
                        <goals><goal>generate</goal></goals>
                    </execution>
                </executions>
            </plugin>
    

    이제 봄 XML 자체. 이것은 스키마 / 유효성 검사기를 생성 한 다음 JAXB를 사용하여 XML 파일에서 POJO를 생성하는 unmarshaller를 만든 다음 spring # annotation을 사용하여 POJO를 쿼리하여 속성 값을 주입합니다.

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" 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-3.2.xsd" >
    
        <!-- Set up schema to validate the XML -->
    
        <bean id="schemaFactory" class="javax.xml.validation.SchemaFactory" factory-method="newInstance">
            <constructor-arg value="http://www.w3.org/2001/XMLSchema"/>
        </bean> 
    
        <bean id="configSchema" class="javax.xml.validation.Schema" factory-bean="schemaFactory" factory-method="newSchema">
            <constructor-arg value="MyConfig.xsd"/>
        </bean>
    
        <!-- Load config XML -->
    
        <bean id="configJaxbContext" class="javax.xml.bind.JAXBContext" factory-method="newInstance">
            <constructor-arg>
                <list>
                    <value>com.ndg.xmlpropertyinjectionexample.config.MyConfig</value>
                </list>
            </constructor-arg>
        </bean>
    
        <bean id="configUnmarshaller" class="javax.xml.bind.Unmarshaller" factory-bean="configJaxbContext" factory-method="createUnmarshaller">
            <property name="schema" ref="configSchema" />
        </bean>
    
        <bean id="myConfig" class="com.ndg.xmlpropertyinjectionexample.config.MyConfig" factory-bean="configUnmarshaller" factory-method="unmarshal">
            <constructor-arg value="MyConfig.xml" />
        </bean>
    
        <!-- Example bean that we want config properties injected into -->
    
        <bean id="myBean" class="com.ndg.xmlpropertyinjectionexample.MyBean">
            <property name="firstMessage" value="#{myConfig.someConfigValue}" />
            <property name="secondMessage" value="#{myConfig.someOtherConfigValue}" />
        </bean>
    
    </beans>
    
  4. ==============================

    4.아파치 소화기 스타일 설정 파일에 대해서는 잘 모르겠지만, 구현하기가 어렵지 않은 해결책을 발견했으며, 나의 XML 설정 파일에 적합합니다.

    아파치 소화기 스타일 설정 파일에 대해서는 잘 모르겠지만, 구현하기가 어렵지 않은 해결책을 발견했으며, 나의 XML 설정 파일에 적합합니다.

    Spring의 일반적인 PropertyPlaceholderConfigurer를 사용할 수 있지만 사용자 지정 구성을 읽으려면 XML을 구문 분석하고 필수 속성을 직접 설정할 수있는 자신 만의 PropertiesPersister를 만들어야합니다.

    여기에 작은 예가 있습니다.

    먼저 기본 속성을 확장하여 고유 한 PropertiesPersister를 만듭니다.

    public class CustomXMLPropertiesPersister extends DefaultPropertiesPersister {
                private XPath dbPath;
                private XPath dbName;
                private XPath dbUsername;
                private XPath dbPassword;
    
                public CustomXMLPropertiesPersister() throws JDOMException  {
                    super();
    
                dbPath = XPath.newInstance("//Configuration/Database/Path");
                dbName = XPath.newInstance("//Configuration/Database/Filename");
                dbUsername = XPath.newInstance("//Configuration/Database/User");
                dbPassword = XPath.newInstance("//Configuration/Database/Password");
            }
    
            public void loadFromXml(Properties props, InputStream is)
            {
                Element rootElem = inputStreamToElement(is);
    
                String path = "";
                String name = "";
                String user = "";
                String password = "";
    
                try
                {
                    path = ((Element) dbPath.selectSingleNode(rootElem)).getValue();
                    name = ((Element) dbName.selectSingleNode(rootElem)).getValue();
                    user = ((Element) dbUsername.selectSingleNode(rootElem)).getValue();
                    password = ((Element) dbPassword.selectSingleNode(rootElem)).getValue();
                }
                catch (JDOMException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
                props.setProperty("db.path", path);
                props.setProperty("db.name", name);
                props.setProperty("db.user", user);
                props.setProperty("db.password", password);
            }
    
            public Element inputStreamToElement(InputStream is)
            {       
                ...
            }
    
            public void storeToXml(Properties props, OutputStream os, String header)
            {
                ...
            }
        }
    

    그런 다음 CustomPropertiesPersister를 응용 프로그램 컨텍스트의 PropertyPlaceholderConfigurer에 삽입합니다.

    <beans ...>
        <bean id="customXMLPropertiesPersister" class="some.package.CustomXMLPropertiesPersister" />
    
        <bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_FALLBACK" />
            <property name="location" value="file:/location/of/the/config/file" />
            <property name="propertiesPersister" ref="customXMLPropertiesPersister" />
        </bean> 
    </beans>
    

    그 후에는 다음과 같이 속성을 사용할 수 있습니다.

    <bean id="someid" class="some.example.class">
      <property name="someValue" value="$(db.name)" />
    </bean>
    
  5. from https://stackoverflow.com/questions/479855/is-there-a-propertyplaceholderconfigurer-like-class-for-use-with-spring-that-acc by cc-by-sa and MIT license