2012-12-04 3 views
2

우선 내가 원하는 것을 보여 드리고자합니다.일반 내 일반

<config> 
    <criteria name="criteriaName" defaultValue="0"> 
     <item value="1"> 
      <criteria name="criteriaName2" defaultValue=""> 
       <item value="foo"> 
       </item> 
       <item value="bar"> 
       </item> 
      </criteria> 
     </item> 
     <item value="2"> 
     </item> 
    </criteria> 
    <criteria name="criteriaName3" defaultValue=""> 
     <item value="foo"> 
     </item> 
    </criteria> 
</config> 

요약 :

  • 기준 이름과 기본값이 (느릅 나무가 될 수 있습니다 문자열, INT 또는 나는 다음과 같이됩니다 클래스의 밖으로 XML 파일을 생성 할 double) 및 x 항목을 차일드로 사용합니다.
  • 항목의 값은 부모 기준 defaultValue와 동일해야합니다.
  • 항목에 다른 기준을 적용 할 수도 있습니다. 기준에 DEFAULTVALUE의 유형 (항목)를 입력 부모로부터 독립

예 : 나는 그것으로 몇 가지 확인을하고 싶어하기 때문에

criteria (type int) 
    item (type int) 
     criteria(type String) 
     item(type String) 

또한 수업의 형태로이 모델이 필요 나중에.

가 지금은 특정 지점에서 어려움을 겪고, 내가 먼저 당신이 내 수업을 보여주지 :

구성 :

@XmlAccessorType(value=XmlAccessType.FIELD) 
@XmlRootElement(name="config") 
public class Config { 

    @XmlElement(name = "criteria") 
    private List<Criteria> criteriaList = new ArrayList<Criteria>(); 

    /*getters and setters*/ 
} 

기준 :

@XmlAccessorType(value=XmlAccessType.FIELD) 
@XmlRootElement(name="criteria") 
public class Criteria<T> { 

    @XmlAttribute 
    private T key; 

    @XmlAttribute 
    private String display; 

    @XmlAttribute 
    private T defaultValue; 

    private List<Item<T>> items = new ArrayList<Item<T>>(); 

    public T getKey() { 
     return key; 
    } 
    /*getters and setters*/ 
} 

항목 :

@XmlAccessorType(value=XmlAccessType.FIELD) 
@XmlRootElement(name="item") 
public class Item<T>{ 

    @XmlAttribute 
    protected T key; 

    @XmlAttribute 
    protected String display; 

    @XmlElement 
    protected List<Criteria<T>> criteria = new ArrayList<Criteria<T>>(); 

    /*getters and setters*/ 
} 

그걸로 내가 만들 수있다. 동일한 유형의 항목이있는 특정 유형의 기준.

는 지금은 항목과 다른 유형이 항목 아래의 기준을 삽입 할,하지만 할 수 없습니다 :

Config config = new Config(); 
    Criteria<Integer> criteria = new Criteria<Integer>(); 
    Item<Integer> item = new Item<Integer>(); 

    Criteria<String> subCriteria = new Criteria<String>(); 
    //this obviously doesn't work 
    item.getCriteria().add(subCriteria); //<-- 

    criteria.getItems().add(item); 
    config.addCriteria(criteria); 

가 나는 또한 (항목)에이 선언 같은 것을 시도 :

@XmlElement 
protected <U> List<Criteria<U>> criteria; 

그러나 이는 속성이 아닌 메소드에서만 작동합니다.

아무도 도와 줄 수 있습니까?

답변

0

나는이 문제를 해결하는 데 아주 가깝다고 생각합니다. 가장 큰 문제는

protected Criteria<T> criteria = new ArrayList<Criteria<T>>(); 

이 올바르지 않다는 것입니다. 요구 사항에 따라 기준에 상위 항목과 동일한 유형이 필요하지 않습니다. 내가 볼 하나의 가능성은

protected Criteria<?> criteria = new ArrayList<Criteria<?>>(); 

유일한 문제는 당신이 경고를 얻을하려고 생각하는 지금이다/삽입하거나 목록에서 요소를 얻을하려고 할 때 캐스팅해야합니다.

+0

감사합니다. 올바른 방향으로 안내해 주셔서 감사합니다. – user1874966

0

어때?

클래스 항목 :

public class Item<T,U>{ 

    protected T key; 

    protected String display; 

    protected Criteria<U> criteria = new Criteria<U>(); 

    /*getters and setters*/ 
} 

등급 기준 :

public class Criteria<T> { 

    private T key; 

    private String display; 

    private T defaultValue; 

    private List<Item<T,?>> items = new ArrayList<Item<T,?>>(); 

    public T getKey() { 
     return key; 
    } 
    /*getters and setters*/ 
} 

는 기본적으로 우리는 내부 기준에 대한 다른 종류의 U와 아이템을 말하는 것입니다. 이 방법을 사용하면 미리 Item 객체의 Criteria 유형을 지정해야하지만 다음과 같이 각기 다른 Criteria 유형의 Items를 동일한 기준으로 혼합 할 수 있습니다.

Criteria<String> c1 = new Criteria<String>(); 
c1.items.add(new Item<String,Float>()); 
c1.items.add(new Item<String,Integer>()); 
+0

그게 아주 좋은 제안이야. 그러나 이제 Java 객체를 XML로 정렬하는 문제가있는 것으로 보입니다. JAXB는 generics를 처리 할 수 ​​없다고 생각합니다. 참고 : 제네릭 (문자열)이 없으면 예상대로 작동합니다 (마샬링의 경우). 내 솔루션은 지금 : 제네릭을 만든 다음 그 중 하나를 사용하여 유효성 검사를 수행하거나 일반이 아닌 다른 데이터 구조에 매핑하여 마샬링합니다. – user1874966

+0

그런 식으로 Criteria의 generic 형식을 Item의 generic 형식과 분리 할 수 ​​있습니까? – think01

+0

위에서 언급 한 것은 내가 원하는 XML 출력을 얻으려면 왕복해야합니다. 나는 (유효성 검사를 위해) 런타임시 제네릭 타입 만 필요하다고 언급 했어야했다. 내 구체적인 경우 XML을 내 스키마로 언 마샬 해제 할 필요가 없습니다. 설명 : XML은 웹 서비스 호출에 대한 구성입니다. 런타임시 (일반) 구성을 가져오고 호출자가받은 필드의 유효성을 검사합니다. XML 부분은 호출자에게 "허용 된"입력 필드 형식을 제공하기위한 것입니다 – user1874966

관련 문제