2012-03-27 19 views
2

저는 Java에 비교적 익숙하며 이에 대한 도움을 주셔서 감사합니다!Java/JPA - 객체/엔티티의 속성을 동적으로 설정합니다.

이 같은 제품의 전체 XML 파일이 있습니다

<product> 
    <title>Product Title</title> 
    <colour>Red</colour> 
</product> 

을 그리고 나는이 같은 JPA 엔티티가 :

@Entity 
public Product extends Model { 

    public String title; 
    public String colour; 

} 

을 그리고 행복하게처럼 내 JPA 객체로 XML을 구문 분석 할 수 이 :

public void parseElement(String elementName, String elementValue) { 
    if (elementName == "title") { 
     product.title = elementValue; 
    } 
    else if (elementName == "colour") { 
     product.colour = elementValue; 
    } 
} 

그러나 문제 제품 당 50 개가 넘는 필드가 있다는 것입니다. 50 개 이상의 절을 if-else 문으로 작성할 수 있지만 더 나은 대안을 먼저 확인해 볼 가치가 있다고 생각했습니다! XML 요소 이름은 직접 제품 클래스의 속성 이름에 일치하는 것으로

, 나는이 완벽 할 것 같은 것을 생각 :

public void parseElement(String elementName, String elementValue) { 
    product[elementName] = elementValue; 
} 

을하지만 자바는 표기법을 좋아하지 않는다. 비슷한 결과를 얻을 수있는 다른 방법이 있습니까? 아니면 그것을 빨아 내고 collosal if-else 문을 써야합니까?

도움을 주시면 감사하겠습니다.

건배!

+0

허용되는 답변은 당시 문제의 해결 방법이었습니다. 몇 달 후, 제안 된 라이브러리를 시험 사용해 볼 가치가있는 변경 사항이 요청되었고 제안 사항에 대한 감사의 말을 전했습니다. 이제는 XStream으로 이식하려고합니다. 건배! –

답변

3

리플렉션 (오류 처리 생략)을 사용해야합니다.

product.getClass().getDeclaredField(elementName).set(product, elementValue); 

그러나 저는 XStream을 제안한 다른 사람들이 있습니다. XML 파일을 구문 분석하는 데 훨씬 깨끗한 방법입니다.

+1

XStream을 사용할 때의 요점은 필자가 XML 파싱을 "적절하게"수행했기 때문에 확실히 이해할 수 있습니다. 감사. XML과 관련이없는 다른 유사한 문제에 대해 제네릭으로 사용할 수 있으므로 답변을 수락했습니다. –

1

체크 아웃 BeanUtils.setProperty

http://commons.apache.org/beanutils/

+1

이유는 모르겠지만 현재 설정 (Play!프레임 워크, JPA와 최대 절전 모드), 어쨌든 고마워요. 미래를 염두에 두십시오. –

5

자바는 XML 처리를위한 많은 프레임 워크를 알고있다. 또한 xml과 객체를 serialize/deserialize하는 일부 libs. 나는 JAXB을 보길 권합니다.

+0

확실히 조사해 보겠습니다. XML 구문 분석이 분당 (SAX와 사용자 지정 처리기를 사용하여) 적합하기는하지만 또 다른 주석에서 말했듯이 마지막 조정 (빡빡한 마감 시간!)을 추가하기 만했습니다. JAXB에 신선한, 시원한 소리를내는 다음 번에 JAXB를 쓸 것입니다 :) –

2

다른 옵션은 XStream과 같은 것을 사용하여 xml과의 엔티티를 직렬화/비 직렬화 할 수 있습니다.

+0

필자의 JAXB 주석과 마찬가지로 나는 모든 파싱을 다시 할 시간이 없다. (나는 표준 객체뿐만 아니라 JPA 엔티티를 다루기 때문에 특히 신중하다.) 하지만 일단 작업량이 조금 줄어들면 XStream에 소용돌이가 될 것입니다. 당신의 도움을 주셔서 감사합니다! –

0

흠, 아마하지 최상의 솔루션하지만 당신은 단순히지도를 사용할 수 있습니다

public Product extends Model { 
    public Map<String,String> myMap = new HashMap<String,String>(); 
} 

를 실행 한 다음,

public void parseElement(String elementName, String elementValue) { 
    product.myMap.put(elementName,elementValue); 
} 
+0

그래, 나도 그렇게 생각했는데 JPA로 어떻게 잘 할 수 있을지 모르겠다. 어쨌든 고마워 :) –

0

당신이 사용할 수있는 매우 잘 Apache Commons Lang 알려진 다음과 같은 일을 할 :

FieldUtils.writeField(myObject, fieldName, fieldValue); 
관련 문제