#java #http #esb #mule
#java #http #esb #mule
Вопрос:
Я пытаюсь создать простой сервис, в котором выполняется HTTP-запрос, я получаю карту пар ключ / значение для параметров запроса и возвращаю что-то в ответ. Вот соответствующая часть моего конфигурационного файла:
<servlet:http-request-to-parameter-map name="http-request-to-param-map"/>
<pattern:simple-service name="ScenarioIndex"
address="http://localhost:63081/index"
transformer-refs="http-request-to-param-map"
>
<component>
<singleton-object class="com.test.ScenarioIndex"/>
</component>
</pattern:simple-service>
Вот соответствующая часть класса ScenarioIndex.
public Object scenarioIndex(Map queryParameters) {
return queryParameters.toString();
}
Для начала я просто хочу проверить, работает ли часть параметров запроса так, как я думаю, поэтому я возвращаю строковое представление параметров запроса. Реальная реализация после того, как это заработает, будет более сложной.
Сервер запускается нормально, но при попадании на localhost:63081/index
URL-адрес, с параметрами запроса или без них, я получаю следующее исключение:
ERROR 2011-06-03 13:29:04,353 [connector.http.mule.default.receiver.2] org.mule.exception.DefaultServiceExceptionStrategy:
********************************************************************************
Message : The object transformed is of type: "SimpleDataType{type=org.mule.transport.NullPayload, mimeType='*/*'}", but the expected return type is "SimpleDataType{type=java.util.Map, mimeType='*/*'}". Message payload is of type: String
Type : org.mule.api.transformer.TransformerMessagingException
Code : MULE_ERROR--2
Payload : /index?param=true
JavaDoc : http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerMessagingException.html
********************************************************************************
Exception stack is:
1. The object transformed is of type: "SimpleDataType{type=org.mule.transport.NullPayload, mimeType='*/*'}", but the expected return type is "SimpleDataType{type=java.util.Map, mimeType='*/*'}". Message payload is of type: String (org.mule.api.transformer.TransformerMessagingException)
org.mule.transformer.AbstractMessageTransformer:183 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerMessagingException.html)
********************************************************************************
Root Exception stack trace:
org.mule.api.transformer.TransformerMessagingException: The object transformed is of type: "SimpleDataType{type=org.mule.transport.NullPayload, mimeType='*/*'}", but the expected return type is "SimpleDataType{type=java.util.Map, mimeType='*/*'}". Message payload is of type: String
at org.mule.transformer.AbstractMessageTransformer.checkReturnClass(AbstractMessageTransformer.java:183)
at org.mule.transformer.AbstractMessageTransformer.transform(AbstractMessageTransformer.java:162)
at org.mule.transformer.AbstractMessageTransformer.transform(AbstractMessageTransformer.java:93)
at org.mule.DefaultMuleMessage.applyAllTransformers(DefaultMuleMessage.java:1305)
at org.mule.DefaultMuleMessage.applyTransformers(DefaultMuleMessage.java:1265)
at org.mule.DefaultMuleMessage.applyTransformers(DefaultMuleMessage.java:1258)
at org.mule.transformer.AbstractTransformer.process(AbstractTransformer.java:118)
at org.mule.processor.ExceptionHandlingMessageProcessor.process(ExceptionHandlingMessageProcessor.java:25)
at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:185)
at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:158)
at org.mule.transport.AbstractMessageReceiver.routeMessage(AbstractMessageReceiver.java:145)
at org.mule.transport.http.HttpMessageReceiver$HttpWorker.doRequest(HttpMessageReceiver.java:247)
at org.mule.transport.http.HttpMessageReceiver$HttpWorker.processRequest(HttpMessageReceiver.java:206)
at org.mule.transport.http.HttpMessageReceiver$HttpWorker.run(HttpMessageReceiver.java:164)
at org.mule.work.WorkerContext.run(WorkerContext.java:309)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
at java.lang.Thread.run(Thread.java:680)
Если я удалю ссылку на преобразователь http-запроса в parameter-map, я могу взять строку и вернуть строку. Я не понимаю, почему получение карты внезапно останавливает меня от возврата строки. Любая помощь в этом отношении?
Ответ №1:
Я понятия не имею, как решить эту проблему, как я ее задал, но я нашел гораздо лучшее решение. Используя встроенную поддержку Jersey RESTful, я могу получить параметры запроса гораздо лучшим способом. Мой сервис стал
<pattern:simple-service name="ScenarioIndex"
address="http://localhost:63081/index"
type="jax-rs">
<component>
<singleton-object class="com.test.ScenarioIndex"/>
</component>
</pattern:simple-service>
и в моем классе:
@GET
@Produces(MediaType.APPLICATION_XML)
@Path("/kml")
public String scenarioIndex(
@QueryParam("startTime") @DefaultValue("-1") long startTime,
@QueryParam("endTime") @DefaultValue("-1") long endTime) {
// do the work in here
return null;
}
Это делает несколько вещей для меня. 1) Он соответствующим образом устанавливает типы содержимого заголовков, чтобы браузер etc знал, как отображать выходные данные (в виде XML, в отличие от необработанного текста). 2) Это позволяет мне иметь типобезопасный способ обработки параметров запроса.