2011-08-30 10 views
11

Estoy usando JAX-WS para servicios web.Java: JAX-WS Mapeo

Siempre que uso un char como parámetro de método, lo estoy obteniendo como unsignedShort en el xsd (Focus on weatherLetter).

Aquí está la declaración:

@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 
) 

Aquí es las correlaciones de tipo me sale:

<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> 

¿Cómo puedo obtener weatherLetter para generar como Char o 1 Carta de cuerda o algo?

+0

Tener juguete intentó cambiándolo de char a String en la declaración? – 8vius

+0

También si puede publicar algún código del lado del servidor para ver lo que está enviando sería bueno. – 8vius

+0

No presionando, pero si encuentra una respuesta que se acepta, siéntase libre de marcarla como uno :) –

Respuesta

10

Actualización:

Una forma de hacerlo es la de XSD (si lo hace primer contrato), por ejemplo, agregue un XSD Restriction directamente, p. ej.

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

Pero creo que la pregunta está en último contrato (por ejemplo, escribir código que genera el XSD, no al revés)

Esto todavía no es compatible con JAX-WS o JAXB, en lo yo sé (pero una solicitud de mejora agradable)

Fuentes:

JAX-WS y JAXB no tienen soporte para la generación de código para las restricciones de XSD (por ejemplo xsd: r estriction) http://old.nabble.com/Does-jaxb-2.1-enforce-xs:restriction-td21348458.html

La razón es que la otra dirección (la generación de restricciones por anotación), no se admite también

Solución:

Tome un vistazo a esto: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.5/tutorial/doc/JAXBUsing4.html

Y también a esta pregunta:

JAX-WS and Joda-Time?

No hacer exactamente lo que quiere, pero conseguir un poco más cerca


No creo que se puede tener limitado a 1 carácter de otra manera, un char es de hecho un unsigned short, y lo más cercano que puede limitar a 1 char "cadena".

Si usa un String, permitirá caracteres ilimitados. y @WebParam no tiene una API para limitar la longitud

En realidad no vi una manera de hacer restricciones XSD en absoluto utilizando JAX-WS, pero puedo estar equivocado

1

Usted debe tratar de cambiarlo de char a Cuerda en su declaración si va a recibir un solo carácter, si está programando el lado del cliente no debería haber mucho problema al hacerlo

5

utilizar un adaptador, algo así como:

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); 
    } 

} 

Y luego, en su WXStatus (definir una sola clase como argumento de entrada en lugar de pase ing en un montón de parámetros individuales - JAX ya se está convirtiendo esto en un complexType por lo que puede, así, además de que es un mejor estilo de programación orientada a objetos), añadir esta anotación (ya sea en el campo o captador):

@XmlJavaTypeAdapter(CharAdapter.class) 
char weatherLetter; 

Esto permitirá un/marshalling en su lado del servidor y el cliente lo verá como un xs: string. Un efecto secundario es que estamos usando el envoltorio primitivo para char, tendrás que manejar el nulo.

ACTUALIZACIÓN EDIT: No creo que haya ninguna manera se puede especificar la longitud de la cadena con esto, sin embargo, sin crear manualmente/editar su WSDL con algo como:

<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 - Soy el líder de EclipseLink JAXB (MOXy), y esto es exactamente lo que habría propuesto. –

+1

@Blaise - ¿Diría que entonces una anotación '@ XsdRestriction' es una solicitud de mejora válida? se pierde de XSD a Bean, parece una brecha para mí, ¿cómo se puede saber si está en la hoja de ruta de JAXB? – ruchirhhi

+1

@ruchirhhi: una solicitud común es aprovechar las anotaciones de Validación de frijol (JSR-303) para conocer las restricciones. La mejor manera de proceder es agregar una solicitud de función con una implementación individual (Metro: http://java.net/jira/browse/JAXB/, MOXy: https://bugs.eclipse.org/bugs/enter_bug .cgi? product = EclipseLink). –