복붙노트

[SPRING] 서로 참조하는 XML 태그로 Java 객체를 만드는 방법은 무엇입니까?

SPRING

서로 참조하는 XML 태그로 Java 객체를 만드는 방법은 무엇입니까?

XML에서 생성 된 세 가지 유형의 Java 객체에 해당하는 태그가있는 XML이 있습니다. 객체의 형식은 다음과 같습니다.

A
- static Map<String, A>
- String name
- String aInfo1
- String aInfo2

B
- static Map<String, B>
- String name
- String bInfo1
- String bInfo2

C
- A aObject
- B bObject

이제 XML에서 A 객체 및 B 객체에 대한 태그 목록을 정의한 다음 이름 필드를 사용하여 A 및 B 객체를 참조하는 C 객체에 대한 태그를 정의합니다. 두 가지 요구 사항이 있습니다.

JAXB와 같은 일부 Java 프레임 워크에 대해서는 읽었지만 XML에서 이러한 유형의 객체를 만드는 방법을 찾을 수 없습니다. Java에서 최소한의 로직으로이 작업을 수행 할 수있는 프레임 워크가 있습니까?

편집하다:

또 다른 요구 사항이 있습니다. 나는 폼의 D와 E 객체를 정의 할 필요가있다.

D
- Map<A, E>

web.xml에서 서블릿을 정의하는 방법과 비슷한 E 객체를 정의합니다. 즉, 먼저 E 클래스의 이름과 클래스를 정의한 다음 다른 위치에서 E의 이름을 사용합니다. 또한 매개 변수를 전달하여 E 개체를 인스턴스화합니다. 태그는 다음과 같습니다.

<E>
    <name>queryProcessor</name>
    <class>com.mydomain.QueryProcessor</class>
</E>

이제 이것은 D에서 Map의 내용을 정의하는 동안 사용됩니다.

<D>
    <map>
        <A>name_of_some_A_object</A>
        <E name="queryProcessor">
            <param1>name_of_some_B_object</param1>
            <param2>name_of_some_B_object</param2>
        </E>
        <A>name_of_some_A_object</A>
        <E name="queryProcessor">
            <param1>name_of_some_B_object</param1>
            <param2>name_of_some_B_object</param2>
        </E>
     </map>
 </D>

본질적으로 D의지도는 매개 변수가 전달 된 기본 유형 E의 클래스와 이름으로 참조 된 A의 객체를 인스턴스화하여 채워집니다.

해결법

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

    1.(JAXB 어노테이션에 익숙하고 XSD가 아닌 Java로 인터페이스를 제어하려는 경우에도 다른 방법을 사용할 수 있습니다).

    (JAXB 어노테이션에 익숙하고 XSD가 아닌 Java로 인터페이스를 제어하려는 경우에도 다른 방법을 사용할 수 있습니다).

    참고 : 정적지도는 사용하려는 것과 다를 가능성이 높습니다. 해결하려는 문제에 대해 더 자세히 설명하면 몇 가지 대안을 제시 할 수 있습니다.

    편집하다:

    당신이 바퀴를 발명 한 것처럼 보입니다. 봄을보고 자신의 필요에 맞는 것인지 확인하십시오. 그렇지 않으면 이유를 설명하십시오.

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

    2.XML을 변경하거나 XML에서 Spring XML 구성 파일을 생성하는 XSTL을 생성하여 Spring과 같은 공통 프레임 워크로 수행 할 수 있습니다.

    XML을 변경하거나 XML에서 Spring XML 구성 파일을 생성하는 XSTL을 생성하여 Spring과 같은 공통 프레임 워크로 수행 할 수 있습니다.

    스프링 코어 문서는 아마도 당신을 시작하기에 충분할 것입니다. XML의 예는 다음과 같습니다.

    <bean id="beanOneId" class="the.bean.Class">
        <property name="someProperty" value="staticValue">
        <property name="someOtherProperty" ref="beanTwoId">
    </bean>
    <bean id="beanTwoId" class="the.otherbean.Class">
        <property name="someOtherProperty" ref="beanOneId">
        <property name="someOtherProperty" ref="beanThreeId">
    </bean>
    

    그러나 당신이 묘사하는 것은 너무 성찰해서는 안됩니다. 다른 객체가 생성자에서 참조를 필요로하지 않는다고 가정하면 (setX), XML을 스캔하여 이름이있는 모든 객체를 만들고 저장하며 "연결"목록을 기억하십시오. 모든 개체가 생성 된 후 연결 목록의 모든 연결을 수행하십시오.

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

    3.어쩌면 XStream을보고 싶을 것입니다 : http://x-stream.github.io/

    어쩌면 XStream을보고 싶을 것입니다 : http://x-stream.github.io/

    XML과주고받는 객체를 마샬링하고 비 정렬 화 (unmarshal)하는 좋은 라이브러리이며, (Spring과 달리) 더 이상 아무것도하지 않습니다. http://x-stream.github.io/tutorial.html의 예제와 같이 XML에서 객체를 쉽게로드 할 수 있습니다.

    Person newJoe = (Person)xstream.fromXML(xml);
    

    XStream이 XML을 이해하려면 설명 된 http://x-stream.github.io/alias-tutorial.html과 같은 일부 별칭을 설정해야합니다.

    XStream 단독으로는 두 개의 정적지도가 원인이므로 문제를 완전히 해결할 수 없습니다. 그러나 XStream에 XML에서 As 및 Bs 목록을로드 한 다음 목록에서 두 개의 맵을 작성할 수 있습니다.

    A와 B를 참조하는 객체 C의 경우 객체 참조에 대해 설명하는 다음 자습서를 읽을 수 있습니다. http://x-stream.github.io/graphs.html. 필요에 맞지 않으면 XStream을 사용하여 XML에서 필요한 정보를 읽을 수있는 다른 클래스를 쉽게 만들 수 있습니다.

    public class CInfo {
        public String aName;
        public String bName
    }
    

    CInfo를 사용하여 C 인스턴스를 생성하십시오. 이미 A와 B의 이름과 인스턴스 맵이 있다면, 그것은 사소할 것입니다.

  4. from https://stackoverflow.com/questions/8358791/how-to-create-java-objects-from-xml-tags-which-are-referring-each-other by cc-by-sa and MIT license