2009-09-02 3 views
0

Hibernate를 통해 반환 된 구체적인 데이터 bean 또는 Jakarta Commons/BeanUtils의 RowSetDynaClass (JDBC 결과 세트를 래핑)를 사용하여 반환 된 DynaBeans에 대해 작동 할 수있는 기능을 개발 중입니다. . RowSetDynaClass는 기본적으로 모든 bean 프라퍼티 이름을 소문자로 만들며, WrapDynaBean을 사용하여 모든 concrete bean을 Hibernate에서 DynaBeans로 변환해야한다. RowSetDynaClass의 기본 lower case는 좋은 생각 인 것 같지만, 미리 구체적인 콩의 속성 이름이 어떻게 처리 될지 미리 알지 못할 수도 있습니다. Hibernate 설정으로 인해 테이블 ​​컬럼 이름과 동일하게 취급 할 필요가 없다.모든 DynaBean 속성 이름을 소문자로 쉽게 변환하는 방법이 필요합니다.

BeanUtils를 사용하여 속성 이름에 소문자를 사용하는 기능이 내장되어 있습니까? 내가 RowSetDynaClass 이외의 문서화 찾을 수 없습니다. BeanUtils에 내장 된 무언가 대신, 누구나 자신을 달성 할 수있는 가장 좋은 방법을 제안 할 수 있습니까?

답변

1

다음은 (문자열) 키의 경우 낮은 강요하는지도에 DynaBeans를 변환 내가 그동안 고안 한 빠른/더러운 방법입니다 다른 농구를 통해. 내가 thusly 히 콩을 처리했다 반면 :

public void header(List<DynaBean> headerColumns) throws WriteException { 
    for (DynaBean column : headerColumns) { 
     /* 
     * RowSetDynaClass returns beans with lower case properties by default 
     * but this is not guaranteed if beans are coming from Hibernate. 
     * 
     * Converting from the bean to a map however loses DynaBeans' inherent 
     * type conversions, which in turn entails the converting back and forth 
     * from String, to BigDecimal, to int as seen below 
     */ 
     Map columnMap = asLowerCaseIndexedMap(column); 

     int col = (new BigDecimal(columnMap.get("columnnbr").toString())).intValue(); 
     int width = (new BigDecimal(columnMap.get("columnwdth").toString())).intValue(); 
1

나는 쉬운 방법을 모르고 있습니다. 잠재적 인 당신은 Resolver 인터페이스의 구현을 스스로 할 수 있습니다.

그러나 그렇지 않으면 Smooks (http://www.smooks.org/) 또는 Dozer (http://dozer.sourceforge.net)와 같은 다른 변환 프레임 워크를 사용하는 것이 좋습니다.

도저에는 속성에 대해 와일드 카드 일치를 지정할 수있는 기능이 있습니다. Smooks는보다 변형 지향적이므로 모든 필드 매핑을 명시 적으로 지정해야합니다.

두 가지 모두 IDE 플러그인을 사용하기 때문에 더 쉽고 제어 된 방식으로 맵핑을 생성하는 데 도움이 될 수 있습니다. 불행하게도이 뛰어 나에게 강요하고있다

private Map asLowerCaseIndexedMap(DynaBean bean) { 
    Map lowerCaseIndexedMap = new HashMap(); 
    DynaProperty[] dynaProperties = bean.getDynaClass().getDynaProperties(); 

    for (int i=0, n=dynaProperties.length; i<n; i++) { 
     String propertyName = dynaProperties[i].getName(); 
     lowerCaseIndexedMap.put(propertyName.toLowerCase(), bean.get(propertyName)); 
    } 

    return lowerCaseIndexedMap; 
} 

을 :

+0

이 Smooks 도저 알고 있었다하지만 그러나 나는 소개 할 수있는 권한을 가지고 있지 않습니다

public void header(List<DynaBean> headerColumns) throws WriteException { for (DynaBean column : headerColumns) { int col = (Integer)column.get("columnNumber"); int width = (Integer)column.get("columnWidth"); //etcetera 

을 지금은이 방법으로 그렇게해야 새로운 도서관, 상사가 모두 휴가를 떠나고 어제를 원합니다.) BeanUtils에서 벗어나지 않고 고안 한 답/해결책을 게시 할 것입니다. –

+0

그냥 제안 : 당신은 아마도 질문에 대한 답변으로 솔루션을 게시 할 수 있지만 질문에 대한 편집으로 게시 할 수는 없습니다. –

+0

글쎄, 저는 보통 내 대답을 내 자신의 질문에 게시했습니다. 그러나 저는 분쟁합니다. 그러면 내 질문을 "부딪히는 것"처럼 보일 수도 있습니다. 이번에는 편집으로했습니다. –