2009-09-23 4 views
5

JAXB 프로젝트에서 작업하고 있지만 JAXB 및 char 데이터 형식에 약간의 문제가 있습니다.Java : JAXB 및 char 사용

char gender = 'M'; 

는에 정렬 화 후 변환 :

<gender>77</gender> 

그래서 내가 문자를 정수로 매핑하고 있다고 생각하지만, 나는 단순히 문자열로 매핑 할. 어떻게해야합니까? 심지어 가능할까요? 내가 내 마음에있어

+1

성별을 char로 저장하지 말고 대신'enum'을 사용하십시오. –

+0

@Joachim Sauer : 열거 형은 성을 저장하는 더 나은 옵션이 될 것이라고 말하면서도 적합합니다. 하지만 JAXB의 가능성을 모색하고 있습니다. 그리고 나는 고집스럽게 생각했기 때문에 char : -p를 사용하는 해결책이 있어야한다고 생각했습니다. – Korenaga

+0

이것은 JAXB (Metro)의 특정 구현에서 JAXB (EclipseLink MOXy) 마샬링 문자의 다른 버그가 올바르게 발생했습니다. –

답변

5

는 제대로 원시 문자를 처리하기 위해 JAXB를 구성 할 수있는 방법은없는 것처럼 보인다. 나는 그것을 받아들이는데 어려움을 겪고있다.

XmlAdaptor을 문자열로 강제 변환하려고 시도했지만 런타임은 프리미티브가 아닌 객체 유형에 주석이 달린 어댑터 만 허용하는 것으로 보입니다.

@XmlTransient 
    char gender = 'M'; 

    @XmlElement(name="gender") 
    public void setGenderAsString(String gender) { 
     this.gender = gender.charAt(0); 
    } 

    public String getGenderAsString() { 
     return String.valueOf(gender); 
    } 

아주 좋은 아니, 나는거야 : 내가 생각할 수있는

유일한 해결 방법은 @XmlTransient으로 문자 필드를 표시 한 다음 얻을 getter 및 setter를 작성하고 문자열로 값을 설정하는 것입니다 당신에게 줄 수는 있지만 실제로 char 필드를 String으로 변경하는 것보다는 부족합니다.

+0

이 문제는 특히 JAXB의 Metro 구현과 관련되어 있으며 JAXB (EclipseLink MOXy)의 다른 구현은이 사용 사례를 올바르게 처리합니다. –

1

우선 :) 일부 실험 후

String gender = "M"; 
1

이것은 여전히 ​​Metro JAXB (RI), JDK 1.6.0_20과 함께 제공되는 Metro 버전 이상에서 여전히 문제가있는 것으로 보입니다.

는 EclipseLink JAXB는 (목시) 보안관이 올바르게 문자 :

은 EclipseLink가 JAXB 단순히 클래스 경로에 eclipselink.jar를 추가 사용하고 jaxb.properties는 모델 클래스에 파일을 추가하려면 다음 항목이 있습니다.

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 
0

특수 XmlAdapter를 만듭니다.

그러면 package-info.java를 사용하여 전체 패키지에 등록 할 수 있습니다 (다른 클래스 내에서 정보를 잊어 버리지 않도록). 또는 특정 필드에만 사용하십시오.

http://blogs.oracle.com/CoreJavaTechTips/entry/exchanging_data_with_xml_and 자세한 내용은 참조하십시오. 트릭 그게

+1

내가 궁금한데, 왜'v.toString()'대신에'new String (new char [] {v})'을해야할까요? –

2
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class) 

이 어댑터에서 프리미티브

와 함께 작동하도록 유형을 지정 패키지 정보에 동일하게 사용

당신이 발견 패키지

을 위해 전 세계적으로 그것을 의미합니다 이것은 실험 후입니다.

public class MyAdapter extends XmlAdapter<String, Integer> {