XmlAdapter не вызывается - PullRequest
       28

XmlAdapter не вызывается

0 голосов
/ 24 января 2019

У меня есть WS, с его интерфейсом и реализацией:

@WebService
public interface MyApi{

   @WebMethod
   public @XmlElement MyResponse myMethod(
      @WebParam(name = "myParam") @XmlElement(required = true) PersonId personId);
}

И PersonId, что позволяет выбрать один из нескольких методов идентификации.

@XmlType(name = "personId")
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
public class IdPaciente implements Serializable {
   private static final long serialVersionUID = 1L;

   private Passport passport;
   private DrivingLicence drivingLicence;

   @XmlElements(
      {
         @XmlElement(name = "passport", type = Passport.class),
         @XmlElement(name = "drivingLicence", type = DrivingLicence.class)
      })
   public Object getId() {
      return this.passport != null ? this.passport : this.drivingLicence;
   }
   ...
}

Каждый из этих компонентов Passport и DrivingLicence имеет только атрибут String со значением кода:

@XmlType(name="passport")
public class CipAutonomico implements Serializable {
   private static final long serialVersionUID = 1L;
   private String passportSerial;

   @XmlElement(required = true)
   public String getPassportSerial() {
      return this.passportSerial;
   }
   ...
}

Теперь, это работает, но это также означает, что я закончил с некоторым слишком многословным XML:

<myParam>
   <passport>
      <passportSerial>1234</passportSerial>
   </myParam>
</myParam>

Итак, я создал XmlAdapter для непосредственного преобразования всего компонента Passport в строку с серийным номером:

public class PassportAdapter extends XmlAdapter<String, Passport>{

  @Override
  public Passport unmarshal(String v) throws Exception {
    System.out.println("Unmarshal " + v);
    if (v == null) {
      return null;
    }

    Passport passport = new Passport();
    passport.setPassportSerial(v);
    return passport;
  }

  @Override
  public String marshal(Passport v) throws Exception {
    System.out.println("Marshal " + v);
    if (v == null) {
      return null;
    }

    return v.getPassportSerial();
  }
}

Пока WS развертывается и работает, WSDL не изменился и адаптер не вызывается.

Я аннотировал Passport:

@XmlType(name="passport")
@XmlJavaTypeAdapter(value = PassportAdapter.class)
public class Passport implements Serializable {

И тогда я аннотировал пакет в package-info

@javax.xml.bind.annotation.adapters.XmlJavaTypeAdapters({
  @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(
    type = es.ssib.otic.test.apiCitasWar.ejbCitas.beans.CipAutonomico.class,
    value = es.ssib.otic.test.apiCitasWar.ejbCitas.beans.adapters.CipAutonomicoAdapter.class)
})
package mypackage;

Чего мне не хватает?

Я работаю с WildFly 14.0.1. Финал на JDK 8

...