2014-11-25 19 views
6

JAXB tarafından oluşturulan bir grup dersim var ve bazı sınıflar parametre olarak "Object" kabul eden setter yöntemlerine sahiptir. Örneğin:Nasıl xmlns kaldırılır: xsi ve xsi: JAXB'den türetilmiş XML dosyası

@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; 
} 

benim kodunda bu sınıfların örneklerini oluşturduktan sonra, ben gerekli değeri geçen setter yöntemleri çağırmak. Yöntemin parametresi Object olsa da, değerler büyük olasılıkla dizgilerdir (nasıl tanımlandığı konusunda hiçbir kontrole sahip değilim). Ancak, işleri tutarlı tutmak için dizeyi Object'e gönderirim, böylece yöntemin parametre türüyle eşleşir. Kod şöyle görünür:

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

Ben Marshall Java nesneleri, sadece dizesinin değeri önünde çıkan XML Aşağıdaki olsun: Ben ettik

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

Yöntemin parametre türü ile ona geçirilen veriler arasında eşleşmeyen veri türleri hakkında bir şeyler okuyun. Benim durumumda, yöntem parametresi "Object" olmakla birlikte, ona bir dize iletiyorum (Object'e yazdığım halde). Ben de bu yazıyı gördüm ve bu benim soruna benzer:

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

Ancak, benim sorunun üstesinden gelmek yardımcı olmuyor. Xmlns: xsi ve xsi: type için bu referansları kaldırmanın bir yolu var mı?

Thx

+0

'Car' sınıfı neye benziyor. – lexicore

+0

Lütfen sorunuzunuzu düzenleyin. – lexicore

cevap

0

Benzer bir sorunla karşılaştım. Bu özniteliklere sahip XML'yi, bunu gerçekleştiremeyen bazı WS'ye gönderiyordum. Bu XML'i göndermek için Apache CXF kullandığımı hatırlıyorum, bu yüzden bu özelliklerin kaldırılmasını sağlayan CXF interceptor ile sonuçlandım.

Ne yazık ki, bu özniteliklerin nesnelerini doğrudan JAXB'de "devre dışı bırakmanın" nasıl bir yolunu bulamadım. Yapabildiğiniz şey (ve muhtemelen bunu çözmenin tek yolu olacaktır), oluşturduğunuz XML’i almanız ve bir başka (DOM/SAX) API ile bir kez daha işlem yapmanız ve öznitelikleri el ile kaldırmanızdır. Kesinlikle güzel bir çözüm değildir ama daha iyi bulmak emin değilim: -/

kimse size daha iyi bir yanıt gelmesi durumunda veri diğer belirtiyorsa ben

+0

Bir XML filtresi yazmaktan bahsettiğim bazı forumları okudum (yaptığınız şeye benzediğini sanıyorum) ama neler olduğunu anladığımı doğrulamak için daha temiz bir çözüm olduğunu umduğum için – user3572079

6

JAXB xsi:type ihracat ... mutlu olurdu senin modelinden daha fazla. Senin durumunda, bir dize ayarla, ama alan Object. Böylece verileriniz modelinizden farklı bir türe sahiptir. Davranış doğrudur.

Bunu nasıl düzeltebilirsiniz. Mülkün türünü veri türüyle hizaladınız.

  • o String, neden ilk etapta bir Object olduğundan emin olun: Bunu başarmanın bir yolu oldukça çok sayıda var?
  • Güncelleme: Bunun için jaxb:javaType bağlayıcı kullanabilirsiniz. Bunun yerine, birleşik giriş yerine /@XmlMixed. Ancak

, ben yönteminin parametresi türü ile eşleşen böylece Nesne dize dökme, tutarlı yeterdi.Eğer itiraz için döküm zaman

Sizce dizeye olur?

+0

thx. Maalesef, XSD bana verildiği için, Nesneyi String'den türüne değiştiremiyorum (yöntem hakkında oynamıştım ve String'i kabul etmek için değiştirdim ve xsi: type dediğiniz gibi gidiyor). İkinci öneriniz için iyi bağlantılar var mı yoksa JAXB sınıflarını da değiştirmeyi mi gerektiriyor? Eclipselink MOXy BTW kullanıyorum. Kullanabileceğim bir özellik var mı? String'i Object'e döktüğümde pipetle uğraşıyordum ama şanssızım! ;) – user3572079

+0

@ user3572079 Şemayu değiştiremezsiniz, ancak örneğin 'jaxb: javaType' kullanarak özelleştirebilirsiniz, güncellemeye bakın. Bunun için – lexicore

+0

Thx. Güncelleme – user3572079

3

@XmlElement ek açıklamasındaki type parametresini kullanarak özellik türünü her zaman geçersiz kılabilirsiniz.

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

Thx Blaise'a bir göz atacağım, çözümünüzü benim için de benzer bir sorunu olan diğer kişiye de okudum ve bunu kullanabileceğimi düşündüm. Bununla birlikte, JAXB tarafından oluşturulan sınıfları değiştirmemek yerine programımda kodlamak tercih edilir. Sorgumu almayı umuyordum ama EclipsLink MOXy bunun olmasını önlemek için herhangi bir yol sağlamayacak gibi görünüyor. :( – user3572079

İlgili konular