2017-05-18 3 views
0

J'ai un WSDL fourni par un partenaire, basé sur la norme OTA http://www.opentravel.org/OTA/2003/05.Classe java.util.Map non publique ou n'autorisant pas l'instanciation avec les classes générées automatiquement dans WebService

J'ai généré un client Java en utilisant jaxws-maven-plugin pour générer automatiquement des classes Java. Le port est disponible via un ServiceClient qui fournit les méthodes. Jusqu'à ici, pas de problème du tout.

Les problèmes surviennent lorsque, à des fins de test, nous devons créer une implémentation fictive du WebService.

Je l'ai fait avec d'autres WebServices et n'a pas obtenu d'erreurs, mais pour ce que je reçois l'erreur suivante lors de la mise en œuvre de la méthode de l'interface:

problème de méthode Web: Classe java.util. carte non publique ou ne permet pas instanciation

donc mon interface ressemble à ceci:

@WebService(name = "DistributorsV1Port", targetNamespace = "http://www.opentravel.org/OTA/2003/05") 
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) 
@XmlSeeAlso({ 
     ObjectFactory.class 
}) 
public interface ServiceMock extends ServiceDispatcher<Object, Object> { 

    @WebMethod(operationName = "GetMultiAvailability") 
    @WebResult(name = "OTA_HotelAvailRS", targetNamespace = "http://www.opentravel.org/OTA/2003/05", partName = "response") 
    public OTAHotelAvailRS getMultiAvailability(
     @WebParam(name = "OTA_HotelAvailRQ", targetNamespace = "http://www.opentravel.org/OTA/2003/05", partName = "request") 
       OTAHotelAvailRQ request); 

Une d la mise en œuvre est la suivante:

@WebService(name = "DistributorsV1Port", targetNamespace = "http://www.opentravel.org/OTA/2003/05") 
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) 
@XmlSeeAlso({ 
     ObjectFactory.class 
}) 
public class ServiceMockImpl extends ServiceDispatcherImpl<Object, Object> implements ServiceMock { 

    @Override 
    public OTAHotelAvailRS getMultiAvailability(OTAHotelAvailRQ request) { 
     return (OTAHotelAvailRS) dispatch(request); 
    } 
} 

Alors ce que je comprends, est que l'un des attributs du OTAHotelAvailRQ est une carte et @WebService n'aime pas retourner Maps. Mais cette classe a été générée automatiquement par le plugin jax-ws, donc je me perds un peu.

C'est l'attribut:

@XmlAnyAttribute 
private Map<QName, String> otherAttributes = new HashMap(); 

Si plus de code est utile, s'il vous plaît demander les classes que vous souhaitez voir.

+0

Map est une interface donc pas moyen de l'instancier. Essayez de le rendre class 'HashMap otherAttributes = new HashMap()' (besoin d'adapter getter/setter aussi) – StanislavL

+0

Je comprends, mais c'est une classe auto-générée par jaxws-maven-plugin, So pourquoi générerait-il une classe qui ne peut être envoyée à travers un ws? –

+0

Il peut être envoyé. Je pense que le problème est l'analyse quand la carte devrait être instanciée. Peut être WS utilise par ex. LinkedHashMap pour garder l'ordre. – StanislavL

Répondre

0

Le problème a finalement été résolu en supprimant:

@WebService(name = "DistributorsV1Port", targetNamespace = "http://www.opentravel.org/OTA/2003/05") 
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) 
@XmlSeeAlso({ 
     ObjectFactory.class 
}) 

De la mise en œuvre. Comme ces annotations sont héritées, je n'ai pas besoin d'elles, et IntelliJ ne s'en plaindra plus. De toute façon, il ne devrait pas y avoir de problème, et je suppose que c'est un problème avec les avertissements d'IntelliJ.