2011-10-07 14 views
8

Estoy desarrollando un servicio web Java que consumirán los clientes de .Net. El servicio expone un método que acepta un objeto como argumento, este objeto tiene un campo de tipo Lista, la clase Fila también tiene un campo de tipo Lista.Llamando a Java Web Service desde .Net que usa la lista <T>

Ahora cuando el cliente Java consume este servicio, ve correctamente los tipos como List, sin embargo, cuando un cliente .Net consume el servicio, termino con la llamada esperando una matriz de tipo Value (por ejemplo, Value [] []) en lugar de List

La compatibilidad de la versión se ha establecido en ".Net 3.5/METRO 1.3".

¿Alguien sabe cómo puedo conseguir que esto funcione de la misma manera con los clientes de .Net y Java que aceptan Lista en lugar de Valor [] []?

talados versiones del servicio web son:

Servicio:

@WebService(serviceName = "Test") 
    public class Test { 

    @WebMethod(operationName = "DataRequest") 
    public DataResponse DataRequest(DataRequest req) { 
     return new DataResponse(); 
    } 

} 

DataRequest:

public class DataRequest { 
    public DataType datType; 
    public String source; 
    public List<RowInfo> rows; 
    public String loginId; 
} 

RowInfo:

public class RowInfo { 
    public List<Value> valueList; 
} 

Valor:

public class Value {  
    public String name; 
    public String value; 
} 

En mi cliente de .Net cuando intento crear el objeto de solicitud, ve el campo de filas de FeeDataRequest como Valor [] [] en lugar de Lista.

La referencia de servicio en .Net se ha configurado para que el tipo de colección sea System.Collections.Generic.List.

¿Alguna idea sobre cómo hacer .Net ve esto correctamente?

+5

Para la integración entre idiomas utilizando WSDL, recomiendo encarecidamente un enfoque de contrato, diseñe su WSDL (+ XSD), genere código Java del lado del servidor y código .net del lado del cliente. Es un poco más trabajo, pero tus posibilidades son mejores de que funcione. – home

+0

+1 a @home para golpearlo en la nariz. Tal como está, WS no admite de forma nativa Java Collections o Maps. Aunque algunos proveedores como Oracle tienen extensiones propietarias que puede usar para lograr esto, es mejor implementar su servicio web multiplataforma con un diseño de arriba hacia abajo. – Perception

+2

Gracias @Perception. Otra ventaja (en mi opinión) es que tiene un contrato _explicit_ definido en un formato independiente del idioma, que de alguna manera lo obliga a mantener la interfaz pequeña y ajustada. – home

Respuesta

0

Todo lo que necesita hacer es utilizar matrices dondequiera que esté lista. no tiene que preocuparse por nada

+1

El problema no es hacer con una sola matriz. Si esperaba una única matriz, no habría ningún problema. Sin embargo, en este caso, .Net ve una matriz irregular (Value [] [])) en lugar de lo que esperaría ver una matriz de RowInfo. –

+0

¿Eso es realmente un problema? ¿Tiene problemas para definir la matriz dentada en .NET? –

+0

@Paul para el problema posterior, estoy del lado de OP, eso es un problema. De hecho, me sorprende que OP no esté viendo una matriz de RowInfo. Algo se ve sospechoso allí. @ Alan debe publicar el WSDL, ¿ha intentado utilizar una matriz en su lugar solo para ver si .NET seleccionó correctamente el WSDL generado como una matriz de RowInfo? – eglasius

1

Puede publicar el WSDL del servicio web.

De forma predeterminada, cuando se genera el WSDL, el objeto List se convierte en una matriz. Es desde el WSDL que .NET intenta construir los tipos de objeto.

Además, si su clase RowInfo tiene sólo una colección de objetos de valor es que no es fácil de usar colección de objetos de valor en el DataRequest en lugar de colección de RowInfo objetos

2

Uso json o xml para enviar datos entre sus servicios.

0

Recomiendo simplemente hacerlo WSDL primero y crear los clientes e interfaces desde allí. A continuación, realice la asignación a los objetos que debe tratar en la implementación del servicio.

Su esquema sería algo así como

<complexType name="DataRequest"> 
    <all> 
     <element name="datType" type="DataType" /> 
     <element name="source" type="string" /> 
     <element name="rows"> 
      <complexType> 
       <sequence> 
        <element name="row" type="RowInfo" minOccurs="0" maxOccurs="unbounded" /> 
       </sequence> 
      </complexType> 
     </element> 
     <element name="loginId" type="string" /> 
    </all> 
</complexType> 

Seguido por el RowInfo utilizando el mismo patrón que teníamos para las filas. Eso es minOccurs = "0" y maxOccurs = "ilimitado". Esto hará que el generador del cliente cree una lista.

<complexType name="RowInfo"> 
    <sequence> 
     <element name="valueList" type="Value" minOccurs="0" maxOccurs="unbounded" /> 
    </sequence> 
<complexType> 

El último tipo que tiene es el valor.

<complexType name="Value"> 
    <all> 
     <element name="name" type="string" /> 
     <element name="value" type="string" /> 
    </all> 
</complexType> 

Por último, necesita un elemento contenedor.

<element name="dataRequest" type="DataRequest" /> 

Por supuesto, lo anterior es solo parafraseando, aún necesita poner los espacios de nombres y cosas así.

Uno de los problemas con los nuevos desarrolladores de servicios web (yo mismo incluido) es que creemos que solo codificar el servicio web y tener la generación de código es el trabajo es una buena idea. Desafortunadamente, después de jugar con eso, creo que si tienes a alguien que sepa cómo escribir el esquema WSDL y XML, tendrías que interoperar mejor y cosechar el valor de los servicios web.

Específicamente la parte del esquema XML. Soy de la escuela que el enfoque híbrido (codifique primero WSDL, pero primer esquema de contrato) es probablemente el mejor enfoque, ya que no necesita lidiar con la repetición del código de enlace. Sin embargo, las habilidades necesarias para entenderlo se vuelven más difíciles.