サーバーとクライアント間でデータを転送するために、JAXBマーシャリングとアンマーシャリングを使用しています。データクラスはサーバーとクライアントの両方で共有されているため、これは正しい方法のようです。私がWebで見つけた例は、一時的なデータ、つまりサーバーに対して新しい要求が行われたときに破棄されるデータには問題ありません。
しかし、私のデータの一部は一時的なものではなく、サーバーの後続のポーリングは更新を探しています。応答にタイムスタンプを含めたので、これらの種類の要求は、変更されたアイテムのみを報告する必要があります。
私が探しているのは、非マーシャリングプロセスをインターセプトする方法です。これにより、POJOの作成時に、コードが呼び出されてその処理が実行されます。盲目的に新しいインスタンスを作成するのではなく、XML要素ノードの属性にエンコードされている一意の識別子を使用して、すでにフェッチされているが古いインスタンスを検索し、それを返します。 。したがって、アンマーシャリングが続行されると、真の更新になります。
ちなみに、私のPOJOデータオブジェクトは拒否権とプロパティ変更の両方のサポートをサポートしており、GUIコードはプロパティ変更イベントを使用して更新自体を更新します。ユーザーが他の場所で更新されたものを変更しているかどうかを通知するために拒否権を使用することもできます。例を以下に示します。
@Entity(name="Operative")
@Table(name="vOperatives")
@XmlRootElement(name="operative")
public class OperativeEntity
extends AbstractEntity {
public static final String IDENT_PROPERTY = "identity";
public static final String GIVEN_NAME_PROPERTY = "given-name";
public static final String FAMILY_NAME_PROPERTY = "family-name";
public static final String EMAIL_PROPERTY = "email";
public static final String EMAIL_VERIFIED_PROPERTY = "email-verified";
private volatile UUID uuid;
private volatile String givenName;
private volatile String familyName;
private volatile String email;
private volatile boolean emailVerified;
public OperativeEntity() {
}
public OperativeEntity(UUIDFactory factory) {
setUUID(factory.generate());
}
@Id
@Column(name="uuid", length=40)
@XmlAttribute(name="uuid")
public String getIdent() {
return null == uuid ? null : uuid.toString();
}
public void setIdent(String uuid) {
setUUID(UUID.fromString(uuid));
}
@Transient
@XmlTransient
public UUID getUUID() {
return uuid;
}
public void setUUID(UUID id) {
if (null == id)
throw new NullPointerException("No UUID given");
uuid = id;
}
@Column(name="gvn", length=60, nullable=true)
@XmlAttribute(name="given-name")
public String getGivenName() {
return givenName;
}
public void setGivenName(String newName)
throws PropertyVetoException {
if (null == givenName && null == newName)
return;
else if (null != givenName && givenName.equals(newName))
return;
final String oldName = givenName;
fireVetoableChange(GIVEN_NAME_PROPERTY, oldName, newName);
givenName = newName;
firePropertyChange(GIVEN_NAME_PROPERTY, oldName, newName);
}
@Column(name="fmly", length=60, nullable=true)
@XmlAttribute(name="family-name")
public String getFamilyName() {
return familyName;
}
public void setFamilyName(String newName)
throws PropertyVetoException {
if (null == familyName && null == newName)
return;
else if (null != familyName && familyName.equals(newName))
return;
final String oldName = familyName;
fireVetoableChange(FAMILY_NAME_PROPERTY, oldName, newName);
familyName = newName;
firePropertyChange(FAMILY_NAME_PROPERTY, oldName, newName);
}
@Column(name="eMail", nullable=true)
@XmlAttribute(name="e-mail")
public String getEMail() {
return email;
}
public void setEMail(String newEMail)
throws PropertyVetoException {
if (null == email && null == newEMail)
return;
else if (null != email && email.equals(newEMail))
return;
final String oldEMail = email;
fireVetoableChange(EMAIL_PROPERTY, oldEMail, newEMail);
email = newEMail;
firePropertyChange(EMAIL_PROPERTY, oldEMail, newEMail);
}
@Column(name="vrfd", nullable=true)
@XmlAttribute(name="email-verified")
public boolean isEMailVerified() {
return emailVerified;
}
public void setEMailVerified(boolean newVerified)
throws PropertyVetoException {
if (newVerified == emailVerified)
return;
final boolean oldVerified = emailVerified;
fireVetoableChange(EMAIL_VERIFIED_PROPERTY, oldVerified, newVerified);
emailVerified = newVerified;
firePropertyChange(EMAIL_VERIFIED_PROPERTY, oldVerified, newVerified);
}
}