سؤال

أنا أعمل في مشروع مع Jaxb، لكنني أركض مشكلة صغيرة مع Jaxb ونموذج Char Datatype.

char gender = 'M';

يترجم بعد الهشاشة في:

<gender>77</gender>

لذلك أعتقد أن سحر يتم تعيينه إلى عدد صحيح، لكنني أريد فقط تعيينه إلى سلسلة. كيف يمكنني أن أفعل هذا؟ هل هو ممكن؟

هل كانت مفيدة؟

المحلول

بعد بعض التجريب، يبدو أنه لا توجد وسيلة لتكوين JAXB للتعامل مع الأحرف البدائية بشكل صحيح. أواجه صعوبة في قبولها، رغم ذلك.

لقد حاولت تحديد XmlAdaptor لمحاولة إكراه في سلسلة، ولكن يبدو أن وقت التشغيل لا يقبل فقط المحولات المشروح على أنواع الكائنات، وليس البدائيات.

الحل الوحيد الذي يمكنني التفكير فيه هو تحديد حقل Char مع @XmlTransient, ثم اكتب getters و setters التي تحصل عليها وتعيين القيمة كسلسلة:

   @XmlTransient
   char gender = 'M';

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

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

ليس لطيفا جدا، وسوف يمنحك، ولكن أقل من تغيير حقل شار الخاص بك في الواقع سلسلة، وهذا كل ما لدي.

نصائح أخرى

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

هذه الحيلة تحدد النوع لجعله يعمل مع البدائيات

في المحول الخاص بك

باستخدام نفسه في معلومات الحزمة يعني أنك تفعل ذلك على مستوى العالم لهذه الحزمة

وجدت هذا بعد التجربة.

public class MyAdapter extends XmlAdapter<String, Integer> {

أول شيء حصلت في ذهني :)

String gender = "M";

لا يزال يبدو أن هذا مشكلة في مترو Jaxb (RI)، على الأقل إصدار المترو الذي يتم شحنه مع JDK 1.6.0_20.

eclipselink jaxb (moxy) marshals char بشكل صحيح:

لاستخدام Eclipselink Jaxb، ما عليك سوى إضافة Eclipselink.jar إلى ClassPath وإضافة ملف JAXB.Properties في فئات النماذج الخاصة بك مع الإدخال التالي:

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

إنشاء XMLADAPTER متخصص:

package br.com.maritima.util;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class CharAdapter extends XmlAdapter<String,Character>{

 @Override
 public String marshal(Character v) throws Exception {
  return new String(new char[]{v});
 }

 @Override
 public Character unmarshal(String v) throws Exception {
   if(v.length()>0)
   return v.charAt(0);
  else return ' ';
 }

}

ثم يمكنك تسجيله على الحزمة بأكملها مع package-info.java (تجنب نسيت ذلك داخل بعض الطبقة الأخرى) أو استخدمه خصيصا لحقل معين.

يرى http://blogs.oracle.com/corejavatechtips/entry/exchanging_data_with_xml_and.لمزيد من المعلومات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top