2016-03-28 10 views
0

ich benutzerdefinierten Proxy-Dienst in WSO2 ESB erstellen 490:nicht neue Asset mit WSO2 ESB erstellen

<?xml version="1.0" encoding="UTF-8"?> 
 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
 
     name="write_2_greg" 
 
     transports="https,http" 
 
     statistics="disable" 
 
     trace="enable" 
 
     startOnLoad="true"> 
 
    <target> 
 
     <inSequence> 
 
     <payloadFactory media-type="json"> 
 
      <format> 
 
\t \t {"name":"2rest_test","context":"/ressttest2","type":"restservice","version":"1.0.0"} 
 
\t </format> 
 
      <args/> 
 
     </payloadFactory> 
 
     <property name="DISABLE_CHUNKING" 
 
        value="true" 
 
        scope="axis2" 
 
        type="STRING"/> 
 
     <property name="Accept" 
 
        expression="$trp:Accept" 
 
        scope="default" 
 
        type="STRING"/> 
 
     <property name="messageType" 
 
        value="application/json" 
 
        scope="axis2" 
 
        type="STRING"/> 
 
     <property name="Authorization" 
 
        expression="fn:concat('Basic ',base64Encode('admin:admin'))" 
 
        scope="transport" 
 
        type="STRING"/> 
 
     <call> 
 
      <endpoint> 
 
       <http trace="enable" 
 
        method="POST" 
 
        uri-template="https://localhost:9443/governance/restservices"/> 
 
      </endpoint> 
 
     </call> 
 
     <property xmlns:ns="http://org.apache.synapse/xsd" 
 
        name="__Status" 
 
        expression="$axis2:HTTP_SC" 
 
        scope="default" 
 
        type="STRING"/> 
 
     <enrich> 
 
      <source type="body" clone="true"/> 
 
      <target type="property" property="res_body"/> 
 
     </enrich> 
 
     <log level="custom"> 
 
      <property name="__Status" expression="$ctx:__Status"/> 
 
      <property name="res_body--" expression="get-property('res_body')"/> 
 
     </log> 
 
     </inSequence> 
 
     <outSequence/> 
 
     <faultSequence/> 
 
    </target> 
 
    <description/> 
 
</proxy>

Diese einfache Proxy nur neue restservice zu GREG erstellen, verwendet es den GREG REST-API . Aber wenn ich diesen Proxy-Dienst ausführen, Code des GREG Antwort 500 Status und überprüfe GREG lügt, so scheint es, Jackson Fehler:

Caused by: org.codehaus.jackson.map.JsonMappingException: Can not construct instance of org.wso2.carbon.governance.api.generic.dataobjects.GenericArtifact, problem: abstract types can only be instantiated with additional type information 
 
at [Source: [email protected]; line: 1, column: 1] 
 
\t at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) 
 
\t at org.codehaus.jackson.map.deser.StdDeserializationContext.instantiationException(StdDeserializationContext.java:212) 
 
\t at org.codehaus.jackson.map.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:97) 
 
\t at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2376) 
 
\t at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1166) 
 
\t at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:410) 
 
\t at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1262) 
 
\t at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1209) 
 
\t at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:757) 
 
\t at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:716) 
 
\t at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:253) 
 
\t ... 40 more

Aber ich kann neue restservice erstellen, die von „Advanced REST-Client Anwendung "(Chrome plugin) enter image description here

Übrigens, ich teste dies mit ESB 490, GREG 510 und GREG 520. Wie kann ich dies von ESB verwendet erreichen?

+0

Warum die Frage unten sein? – yeahliu

Antwort

0

Nach Forschung der Kohlenstoff-Governance-Quellcode, fand ich, dass die Methode „isReadable“ in der Klasse „org.wso2.carbon.governance.rest.api.internal.GenericArtifactMessageBodyReader“

@Override 
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { 
    if (GenericArtifact.class.getName().equals(type.getName()) || GovernanceArtifact.class.getName(). 
      equals(type.getName())) { 
     if (MediaType.APPLICATION_JSON_TYPE.equals(mediaType) || MediaType.APPLICATION_XML_TYPE.equals(mediaType)) { 
      return true; 
     } 
    } 
    return false; 
} 

Wenn Beitrag der json zu fordern, wird diese Methode aufgerufen, um den MediaType zu bestimmen. Die Media akzeptieren

application/json 

Aber der Proxy ich es geschrieben habe den Content-Type gesendet

application/json; charset=UTF-8 

Sie sind nicht die gleichen, so dass die Methode false zurück, und nicht die json Post verarbeiten.

Ich versuche, den ESB-Proxy-Content-Typ wie folgt zurück:

<property name="messageType" value="application/json" scope="axis2" type="STRING"/> 
<property name="ContentType" scope="default" type="STRING" value="application/json"/> 

Aber den Content-Type noch "application/json; charset = UTF-8"

Ich denke, das ist die reson Aber wie können wir es reparieren?

+0

Ich ändere die Methode "isReadable" zurück wahr, was auch immer Medientyp es erhalten, kompilieren Sie den Code und generieren governance.war, ersetzen Sie den Ursprung Krieg, und kann jetzt erstellen Vermögenswert. – yeahliu