2014-11-25 2 views
6

에서 제거하는 방법 JAXB 생성 클래스 집합이 있고 클래스 중 일부는 "Object"를 매개 변수로 사용할 수있는 setter 메서드가 있습니다. 예 :xmlns : xsi 및 xsi : type을 JAXB 정렬 된 XML 파일

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name="Car", propOrder = { 
    "defaultCar" 
} 

public class Car { 
    @XmlElement(name = "DefaultCar") 
    protected Object defaultcar; 

    public void setDefaultCar(Object value) { 
    this.defaultCar = value; 
} 

코드에서 이러한 클래스의 인스턴스를 만든 후에 필요한 값을 전달하는 setter 메서드를 호출합니다. 메서드의 매개 변수가 Object 임에도 불구하고 값은 문자열 일 가능성이 가장 높습니다 (정의 방법을 제어 할 수 없음). 그러나 일관성있게 유지하기 위해 메서드의 매개 변수 유형과 일치하도록 문자열을 Object로 캐스팅합니다. 코드는 다음과 같은 :

Object value = "Old Banger"; 
    Method method = aCar.getClass().getMethod("setDefaultCar", Object.class); 
    method.invoke(aCar, value); 

I 마샬은 자바 객체, 나는 단지 문자열 값의 앞에, 결과 XML 내에서 다음과 같은 얻을 때 : 나는했습니다

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string"

메소드의 매개 변수 유형과 전달 된 데이터 유형간에 불일치하는 데이터 유형에 대한 어딘가를 읽습니다. 내 경우에는 "Object"라는 메서드 매개 변수가 있지만 문자열을 전달합니다 (Object에 캐스트 했음에도 불구하고). 나는 또한이 게시물을 본 적이 그것은 내 문제와 비슷 :

"xsi:type" and "xmlns:xsi" in generated xml by JAXB

그러나, 그것은 내 문제를 극복 도움이되지 않습니다. xmlns : xsi 및 xsi : type에 대한 이러한 참조를 제거 할 수 있습니까?

thx

+0

'자동차'클래스는 어떻게 생겼습니까? – lexicore

+0

질문을 수정하십시오. – lexicore

답변

0

나는 비슷한 문제가있었습니다. 이러한 속성을 가진 XML을 처리 할 수없는 일부 WS에 보내고있었습니다. 이 XML을 보내는 데 Apache CXF를 사용하고 있었기 때문에 이러한 속성의 제거를 처리하는 CXF 인터셉터로 끝났습니다.

슬프게도, 나는 JAXB에서 직접 이러한 속성의 생성을 "비활성화"하는 방법을 찾지 못했습니다. 할 수있는 일 (아마도 유일한 해결책 일 것입니다)은 생성 된 XML을 다른 API (DOM/SAX)로 다시 처리하고 속성을 수동으로 제거하는 것입니다. 그것은 확실히 좋은 해결책이 아니다하지만 난 당신이 더 찾을 수 있는지 확실하지 않습니다 : -/

사람이 당신에게 더 나은 대답을 제공합니다 경우 데이터를 다른 지정하는 경우 나는

+0

필자는 XML 필터 작성과 관련하여 포럼을 읽었습니다. (필자가 한 것과 비슷하다고 생각합니다.)하지만 더 깨끗한 솔루션이 있기를 바랍니다. – user3572079

6

JAXB는 xsi:type 수출 ... 행복 할 것 모델보다. 귀하의 경우 문자열을 설정했지만 필드는 Object입니다. 따라서 데이터 유형이 모델과 다릅니다. 문제가 해결되었습니다.

어떻게 해결할 수 있습니까? 속성 유형을 데이터 유형과 맞 춥니 다.

  • String, 왜 처음에 Object되어 있는지 확인 : 그것을 달성하는 방법은 매우 여러 가지가 있어요?
  • 업데이트 :jaxb:javaType 바인딩을 사용할 수 있습니다.
  • üse @XmlElementRef/@XmlMixed 콤보. 그러나

, 나는이 메소드의 매개 변수 유형과 일치하므로 객체에 문자열을 주조, 일관된 일을 유지합니다.

문자열을 대상으로 캐스트 할 때 어떤 현상이 발생한다고 생각하십니까? :)

+0

thx가 무슨 일이 일어나고 있는지 확인했습니다. 불행히도, XSD가 나에게 제공 되었기 때문에 Object에서 String으로 타입을 변경할 수 없다. (나는 메소드에 대해 놀았고 String을 받아들이도록 변경했고 xsi : type은 당신이 말한 것처럼 간다.) 두 번째 제안에 대한 좋은 링크 또는 JAXB 수업 변경과 관련이 있습니까? 나는 Eclipselink MOXy BTW를 사용하고 있습니다. 사용할 수있는 기능이 있습니까? String을 Object로 캐스팅하려고 시도했을 때 나는 빨대에서 움츠 렸지만 운이 없었습니다! ;) – user3572079

+0

@ user3572079 스키마를 변경할 수는 없지만 예를 들어'jaxb : javaType'을 사용하여 사용자 정의 할 수 있습니다. 업데이트를 참조하십시오. – lexicore

+0

Thx입니다. 내가 당신의 업데이트를보고 – user3572079

3

@XmlElement 주석의 type 매개 변수를 사용하여 언제든지 속성 유형을 무시할 수 있습니다.

@XmlElement(name = "DefaultCar", type=String.class) 
    protected Object defaultcar; 
+0

Thx Blaise, 나도 비슷한 문제가 있었고 내가 그것을 사용할 수 있다고 생각 다른 사람에게 당신의 솔루션을 읽어 보시기 바랍니다. 그러나 JAXB에서 생성 한 클래스를 변경하지 않고 대신 내 프로그램에서 코드화하는 것이 바람직합니다. 내 질문에 대답하기를 바랐지 만, EclipsLink MOXy가 이런 일이 일어나지 않도록 막 다른 수단을 제공하지 않는 것 같습니다. :( – user3572079

관련 문제