2011-08-30 3 views
11

J'utilise JAX-WS pour les services Web.Java: mappage JAX-WS

Chaque fois que j'utilise un caractère comme paramètre de méthode, je l'obtiens comme un unsignedShort dans le xsd (Focus sur weatherLetter).

Voici la déclaration:

@WebMethod 
public boolean setWXtatus(
     @WebParam(name = "weatherLetter") char weatherLetter, 
     @WebParam(name = "weatherDigit") int weatherDigit, 
     @WebParam(name = "cloudCover") int cloudCover, 
     @WebParam(name = "cloudBaseInHundredsOfFeet") int cloudBaseInHundredsOfFeet, 
     @WebParam(name = "pressureInHg") int pressureInHg, 
     @WebParam(name = "visibilityInKm") int visibilityInKm, 
     @WebParam(name = "windSpeed") int windSpeed, 
     @WebParam(name = "windDirection") int windDirection, 
     @WebParam(name = "lastUpdateHour") int lastUpdateHour, 
     @WebParam(name = "lastUpdateMin") int lastUpdateMin 
) 

Voici les applications de type que je reçois:

<xs:complexType name="setWXStatus"> 
<xs:sequence> 
<xs:element name="weatherLetter" type="xs:unsignedShort" minOccurs="0"/> 
<xs:element name="weatherDigit" type="xs:int"/> 
<xs:element name="cloudCover" type="xs:int"/> 
<xs:element name="cloudBaseInHundredsOfFeet" type="xs:int"/> 
<xs:element name="pressureInHg" type="xs:int"/> 
<xs:element name="visibilityInKm" type="xs:int"/> 
<xs:element name="windSpeed" type="xs:int"/> 
<xs:element name="windDirection" type="xs:int"/> 
<xs:element name="lastUpdateHour" type="xs:int"/> 
<xs:element name="lastUpdateMin" type="xs:int"/> 
</xs:sequence> 
</xs:complexType> 

Comment puis-je obtenir weatherLetter pour générer comme Char ou 1 Lettre chaîne ou quelque chose?

+0

Avez jouet a essayé changer de char à Chaîne dans la déclaration? – 8vius

+0

Aussi, si vous pouvez poster du code côté serveur pour voir ce qu'il envoie serait bon. – 8vius

+0

Ne pas pousser, mais si vous trouvez une réponse qui est acceptée, n'hésitez pas à le marquer comme un :) –

Répondre

10

Mise à jour:

Une façon de le faire est en XSD (si vous faites un premier contrat ), par exemple ajoutez-y directement XSD Restriction, par ex.

<xs:element name="singleChar"> 
    <xs:simpleType> 
    <xs:restriction base="xs:string"> 
     <xs:length value="1"/> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:element> 

Mais je pense que la question est sous contrat dernière (par exemple le code d'écriture qui génère le XSD, et non vice versa)

Ce n'est pas encore pris en charge JAX-WS ou JAXB, pour autant que Je sais (mais une demande d'amélioration agréable)

Sources:

JAX-WS et JAXB ne prennent pas en charge la génération de code pour les restrictions de XSD (par exemple xsd: r estriction) http://old.nabble.com/Does-jaxb-2.1-enforce-xs:restriction-td21348458.html

La raison en est que l'autre direction (génération de restrictions par Annotation), ne sont pas pris en charge trop

Solution:

Jetez un oeil à ceci: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html

Et également à cette question:

JAX-WS and Joda-Time?

Ne pas faire exactement ce que vous voulez, mais vous obtenir un peu plus près


Je ne pense pas que vous pouvez avoir limité à 1 caractère de toute autre manière, char est en effet un caractère non signé, et la chose la plus proche que vous pouvez limiter à 1 "String" char.

Si vous utilisez une chaîne, vous autoriserez des caractères illimités. et @WebParam ne dispose pas d'une API pour limiter la longueur

En fait, je ne vois pas une façon de faire des restrictions XSD du tout en utilisant JAX-WS, mais je peux me tromper

1

Vous devriez essayer changer de char à cordes dans votre déclaration si vous devez recevoir un caractère unique, si vous la programmation du côté client, il ne devrait pas être beaucoup de peine ce faisant

5

Utilisez un adaptateur, quelque chose comme:

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


public class CharAdapter extends XmlAdapter<String, Character> { 

    @Override 
    public String marshal(Character c) throws Exception 
    { 
     return String.valueOf(c); 
    } 

    @Override 
    public Character unmarshal(String s) throws Exception 
    { 
    if(s == null) { 
     return null; 
    } 
    if(s.length() != 1) { 
     throw new IllegalArgumentException("Provided string \"" + s + 
       "\" has invalid length of " + s.length() + " should be 1"); 
    } 
     return s.charAt(0); 
    } 

} 

Et puis dans votre WXStatus (définir une seule classe comme argument d'entrée au lieu de passer ING en charge des paramètres individuels - JAX tourne déjà cela dans un complexType afin que vous pouvez aussi bien, plus il est un meilleur style de POO), ajouter cette annotation (soit champ ou getter):

@XmlJavaTypeAdapter(CharAdapter.class) 
char weatherLetter; 

Cela permettra un/marshalling sur votre serveur et le client le verra en tant que xs: string. Un effet secondaire est que nous utilisons wrapper primitif pour char, vous devrez gérer null.

MISE À JOUR EDIT: Je ne pense pas qu'il y ait quelque façon que vous pouvez spécifier la longueur de la chaîne avec ce que, sans créer manuellement/éditer votre WSDL avec quelque chose comme:

<xs:simpleType name="weatherLetter"> 
    <xs:annotation> 
    <xs:documentation>weather character info blah blah</xs:documentation> 
    </xs:annotation> 
    <xs:restriction base="xs:string"> 
    <xs:length value="1"/> 
    </xs:restriction> 
</xs:simpleType> 
+2

+1 - Je suis le lead EclipseLink JAXB (MOXy), et c'est exactement ce que je l'aurais proposé. –

+1

@Blaise - Diriez-vous qu'une annotation '@ XsdRestriction' est une demande d'amélioration valide? il est perdu de XSD à Bean, semble être un trou pour moi, comment peut-on dire si c'est dans la feuille de route pour JAXB? – ruchirhhi

+1

@ruchirhhi - Une demande courante consiste à tirer parti des annotations de validation du bean (JSR-303) pour les restrictions. La meilleure façon de procéder consiste à ajouter une demande de fonctionnalité avec une implémentation individuelle (Metro: http://java.net/jira/browse/JAXB/, MOXy: https://bugs.eclipse.org/bugs/enter_bug .cgi? product = EclipseLink). –