У меня есть 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