JAXB ne peut pas gérer une interface - ce qui me manque?
Je suis familier avec les web services en Java à l'aide de Jax-ws (ou JAXB, pas sûr, de toute façon...).
J'ai créé petit projet avec un seul webservice. Le WS est le seul point de terminaison de transfert et renvoie des objets héritant ITransferResult interface.
Web de contrat de service
//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.RPC)
public interface IBankWebSrv {
@WebMethod
ITransferResult transfer(String accountNumber, double amount);
}
Service Web de mise en œuvre
//Service Implementation
@WebService(endpointInterface = "Contracts.IBankWebSrv")
public class BankWebSrv implements IBankWebSrv {
@Override
public ITransferResult transfer(String accountNumber, double amount) {
ITransferResult result = new TransferResult();
//TODO logic here
result.setSuccessful(true);
return result;
}
}
TransferResult contrat
@XmlJavaTypeAdapter(TransferResult.class)
public interface ITransferResult {
boolean isSuccessful();
void setSuccessful(boolean successful);
}
TransferResult mise en œuvre
public class TransferResult extends XmlAdapter<TransferResult, ITransferResult>
implements ITransferResult {
@XmlElement
boolean successful;
public boolean isSuccessful() {
return this.successful;
}
public void setSuccessful(boolean successful) {
this.successful = successful;
}
@Override
public TransferResult marshal(ITransferResult v) throws Exception {
return (TransferResult) v;
}
@Override
public ITransferResult unmarshal(TransferResult v) throws Exception {
return (ITransferResult) v;
}
}
Lorsque je publie mon web service, j'obtiens l'erreur suivante:
Exception in thread "main" javax.xml.ws.WebServiceException: Impossible de
créer JAXBContext...Causés par: java.de sécurité.PrivilegedActionException:
com.soleil.xml.interne.bind.v2.moment de l'exécution.IllegalAnnotationsException: 1
comtes de IllegalAnnotationExceptions ITransferResult est une interface,
et JAXB ne peut pas gérer les interfaces. ce problème est lié à la
emplacement suivant: à ITransferResult
J'ai regardé de plus DONC pour la réponse et appliquées à la plus répétitive conseils, mais aucun d'entre eux ont travaillé pour moi encore.
Ce qui me manque?
OriginalL'auteur pizycki | 2014-04-21
Vous devez vous connecter pour publier un commentaire.
On dirait qu'il n'est pas le traitement des annotations sur le
TransferResult
classe comme un bindable élément. Cela signifie que vous avez probablement besoin d'ajouter@XmlSeeAlso(TransferResult.class)
à l'interface (ITransferResult
). Vous devez également mettre@XmlRootElement
sur la sérialisation-mise en œuvre (TransferResult
), de sorte qu'un véritable document XML peut être produite, et pas juste un type que vous utilisez dans un autre document. C'est parce que quand JAX-WS mise en œuvre est la création de la JAXB contexte qu'il utilise en interne, il utilise seulement les arguments et les types de résultats que vous définissez sur l'interface de service en tant qu'arguments àJAXB.newInstance(…)
; ce qui n'est pas littéralement qui y sont énumérés (ou trouvables via simple suivant les types) sera omis, et il est tout à fait possible que le type de cartes ne sont pas traitées pour les annotations (après tout, ils n'ont pas besoin d'être des instances de l'interface qu'ils s'adaptent, de même, le type de cours d'adaptation doivent être d'une interface).(Oui, une réponse SOAP est un englobant le document, mais la meilleure façon de l'utiliser est de mettre un seul élément à l'intérieur du SAVON
Body
, et cela signifie que vous avez besoin de savoir l'name
de l'élément. Ce qui signifie qu'une@XmlRootElement
annotation.)Avertissement: je ne suis pas sûr à 100% que cela fonctionne. Si cela ne fonctionne pas, vous aurez à passer à l'aide de types de béton (probablement droit Pojo) que les résultats. Il pourrait ne pas être une chose particulièrement intéressante, mais c'est au moins facile à faire...
OriginalL'auteur Donal Fellows
Vous pouvez avoir besoin de changer de style pour être DOCUMENT au lieu de RPC dans votre déclaration à
@SOAPBinding(style = Style.RPC)
Bien que c'est une vieille question, j'ai pensé que je pourrais répondre comme il est commun exception des gens de rencontre.
La différence entre les deux styles de haut niveau est comme suit
Document: Le type de retour de méthode et les arguments sont clairement expliqués dans un document distinct XSD avec chaque type dans le détail - utile dans le cas de types de données personnalisés (Exemple dans votre cas
ITransferResult
oujava.util.List
).RPC: les types sont définis dans le fichier WSDL lui-même de manière simple.
OriginalL'auteur Santosh Kumar Arjunan