Я пытаюсь создать простой поток мула, который извлекает заголовок и передает user-agent
компоненту REST, который возвращает код состояния на основе извлеченного пользовательского агента.
Здесь мой поток мула
<flow name="restflowFlow1" doc:name="restflowFlow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="9595" path="rest" doc:name="HTTP"/>
<jersey:resources doc:name="REST">
<component class="com.test.RestClass"/>
</jersey:resources>
</flow>
И вот соответствующий класс
@Path("restClass")
public class RestClass implements Callable {
public Response getExample(String toBeValidated)
{
if(toBeValidated.contains("Apple"))
{
return Response.status(Status.OK).entity("hello " + toBeValidated).build();
}
return Response.status(Status.UNAUTHORIZED).entity("hello " + toBeValidated).build();
}
@Override
public Object onCall(MuleEventContext eventContext) throws Exception {
String requiredHeader= eventContext.getMessage().getProperty("user-agent", PropertyScope.INBOUND);
return getExample(requiredHeader);
}
}
Когда я пытаюсь запустить вышеуказанный поток, я получаю следующую ошибку:
ERROR 2014-11-21 13:49:47,909 [[muletestproject].connector.http.mule.default.receiver.02] org.mule.exception.DefaultMessagingExceptionStrategy:
********************************************************************************
Message : Failed to invoke JerseyResourcesComponent{restflowFlow1.component.418586223}. Component that caused exception is: JerseyResourcesComponent{restflowFlow1.component.418586223}. Message payload is of type: String
Code : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. String index out of range: -1 (java.lang.StringIndexOutOfBoundsException)
java.lang.String:1875 (null)
2. Failed to invoke JerseyResourcesComponent{restflowFlow1.component.418586223}. Component that caused exception is: JerseyResourcesComponent{restflowFlow1.component.418586223}. Message payload is of type: String (org.mule.component.ComponentException)
org.mule.component.AbstractComponent:144 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/component/ComponentException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1875)
PS Я совершенно новый для мула. Поэтому я открыт для любых других элегантных подходов.
Реализация Callable в компоненте java дает ему возможность запускаться из вашего потока xml. В вашем случае нет необходимости в Callable, просто комментируйте свой класс обслуживания с помощью аннотаций JAX-RS, чтобы майка могла публиковать общедоступные методы в вашем классе. Когда вы отправляете запрос с адресом, похожим на путь вашего класса обслуживания, трикотаж автоматически вызывает соответствующий метод.
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
@Path("restClass")
public class RestClass {
public Response getExample(@QueryParam("param1") String param1) {
return Response.status(Status.OK).entity("hello " + param1).build();
}
}
Это должно сработать для вас.
Чтобы реализовать вызываемый doenst для Jerse, вы должны использовать аннотации JAX-RS, то есть:
package org.mule.transport.jersey;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.PathParam;
@Path("/helloworld")
public class HelloWorldResource {
@GET
@Produces("text/plain")
@Path("/{name}")
public String sayHelloWithUri(@PathParam("name") String name) {
return "Hello " + name;
}
}
Как указано здесь.