2017-10-03 3 views
2

printemps intégration, en passerelle sortante veulent utiliser URL aussi dynamique commeintégration Spring-passerelle sortante veulent utiliser URL aussi dynamique comme

<bean id="requestValues" class="com.src.model.RequestValues"/> 
    <int-http:outbound-gateway 
       request-channel="reqChannel" url="${UrlValue}" 
       http-method="${reqmethod}" expected-response-type="java.lang.String" header-mapper="headerMapper" 
       charset="UTF-8" reply-timeout="5000" reply-channel="responseChannel" > 
      <int-http:uri-variable name="UrlValue" expression="#{requestValues.getUrl()}" /> 
      <int-http:uri-variable name="reqmethod" expression="#{requestValues.getReqMethod()}" /> 
     </int-http:outbound-gateway> 

Ici Requestvalues ​​est POJO simple, comme

@Data 
public class Requestvalues { 

    public String Url; 
    public String reqMethod; 

} 

org.springframework.beans.factory.BeanCreationException: Erreur lors de la création du bean avec le nom 'org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandler # 0': Impossible de créer le bean interne '(bean interne) # 6ea2bc93' de type [org.springframework.integration.config.ExpressionFactoryBean] lors de la définition de la propriété bean 'uriVariableExpressions' avec la clé [url]; l'exception imbriquée est org.springframework.beans.factory.BeanCreationException: Erreur lors de la création du bean avec le nom '(bean interne) # 6ea2bc93': L'instanciation du bean via le constructeur a échoué; l'exception imbriquée est org.springframework.beans.BeanInstantiationException: impossible d'instancier [org.springframework.integration.config.ExpressionFactoryBean]: le constructeur a levé l'exception; Exception imbriquée est java.lang.IllegalArgumentException: expressionString ne doit pas être vide ou null

Répondre

2

Vous pouvez définir des métadonnées telles que l'URL ou la méthode http en tant qu'en-têtes. Vous pouvez même utiliser Spring EL lors du réglage de l'en-tête, f.e.

<int:header-enricher> 
    <int:header name="url" value="${url.base}/reports/"/> 
</int:header-enricher> 

et en utilisant alors une expression de la passerelle sortante

<int-http:outbound-gateway id='httpGateway' 
url-expression="headers['url']" 
... 
    /> 
+0

'Accept' et' method' ne font pas partie de l'URI et ne peuvent donc pas utiliser 'uri-variable's. –

+0

Merci pour votre réponse, mais petite correction ici Accepter & content-type fonctionnent bien, seule chose veut faire URL aussi dynamique, que l'URL est en train de créer en code Java basé sur certaines conditions – Doss

+0

Mmmm merci d'apprécier votre réponse laissez-le, ici mon doute est de savoir comment rendre mon URL et http-méthode aussi dynamique, qui doit provenir de POJO – Doss

0

Le http-method ne fait pas partie de l'URI; il ne prend pas en charge ou n'utilise pas uri-variables. Pour plus d'informations, utilisez http-method-expression="payload.reqMethod".

De même, Accept ne fait pas partie de l'uri - définir l'en-tête Accept dans le message sortant, il sera mappé.

EDIT

Vous confondez les expressions d'exécution avec des expressions de déclaration de haricots et, comme je l'ai dit, vous devez utiliser l'expression de méthode si vous voulez une sélection de la méthode d'exécution.

Cependant, puisque vous utilisez un bean pour votre Requestvalues, vous n'avez pas du tout besoin d'expressions d'exécution.

<int-http:outbound-gateway 
      request-channel="reqChannel" url="#{requestValues.getUrl()}" 
      http-method=""#{requestValues.getReqMethod()}" expected-response-type="java.lang.String" header-mapper="headerMapper" 
      charset="UTF-8" reply-timeout="5000" reply-channel="responseChannel" > 
</int-http:outbound-gateway> 

Si vous voulez choisir la méthode et l'URL à l'exécution, en fonction du message, vous pouvez utiliser quelque chose comme ...

<int-http:outbound-gateway 
      request-channel="reqChannel" url="${UrlValue}" 
      http-method-expression="headers['method']" expected-response-type="java.lang.String" header-mapper="headerMapper" 
      charset="UTF-8" reply-timeout="5000" reply-channel="responseChannel" > 
     <int-http:uri-variable name="UrlValue" expression="headers['url']" /> 
</int-http:outbound-gateway> 

Lorsque les en-têtes sont définies de façon dynamique quelque part en amont, ou

<int-http:outbound-gateway 
      request-channel="reqChannel" url="${UrlValue}" 
      http-method-expression="@requestValues.getReqMethod()" expected-response-type="java.lang.String" header-mapper="headerMapper" 
      charset="UTF-8" reply-timeout="5000" reply-channel="responseChannel" > 
     <int-http:uri-variable name="UrlValue" expression="@requestValues.getUrl()" /> 
</int-http:outbound-gateway> 

Notez l'utilisation de @ pour faire référence aux beans dans les expressions d'exécution.

+0

Merci pour votre réponse, mais une petite correction ici Accepter & content-type fonctionnent bien, seule chose veut rendre l'URL aussi dynamique, que L'URL crée en Java le code basé dans certaines conditions – Doss

+0

'' '- les en-têtes' Accept' et 'content type' ne sont pas définis une 'uri-variable'; vous devez définir l'en-tête ailleurs, peut-être dans un transformateur. –

+0

Hmm bien Gris, maintenant j'ai modifié ma question, encore une fois je répète ma question veux rendre mon URL et http-méthode comme générique – Doss