Вводящее в заблуждение сообщение об исключении в GatewayMethodInboundMessageMapper с неаннотированными параметрами - PullRequest
0 голосов
/ 13 декабря 2018

Следующий код выдает MessagingException с сообщением At most one parameter (or expression via method-level @Payload) may be mapped to the payload or Message. Found more than one on method [public abstract java.lang.Integer org.example.PayloadAndGatewayHeader$ArithmeticGateway.add(int,int)].

@MessagingGateway
interface ArithmeticGateway {

    @Gateway(requestChannel = "add.input", headers = @GatewayHeader(name = "operand", expression = "#args[1]"))
    Integer add(@Payload final int a, final int b);

}

Желаемая функциональность может быть достигнута с помощью чего-то вроде:

@MessagingGateway
interface ArithmeticGateway {

    @Gateway(requestChannel = "add.input", headers = @GatewayHeader(name = "operand", expression = "#args[1]"))
    @Payload("#args[0]")
    Integer add(final int a, final int b);

}

Если первая версия такжеРабота?Тем не менее, я считаю, что сообщение об ошибке можно улучшить.

Пример проекта можно найти здесь .Пожалуйста, проверьте org.example.PayloadAndGatewayHeader и org.example.PayloadAndGatewayHeaderTest.

EDIT

Цель @GatewayHeader состояла в том, чтобы показать, почему можно захотеть иметь дополнительные параметрыэто не будет частью полезной нагрузки, но я боюсь, что это создало путаницу.Вот более упрощенный пример:

@MessagingGateway
interface ArithmeticGateway {

    @Gateway(requestChannel = "identity.input")
    Integer identity(@Payload final int a, final int unused);

}

Не следует ли игнорировать параметр unused, поскольку уже есть другой, который помечен @Payload?

1 Ответ

0 голосов
/ 13 декабря 2018

Вы не можете смешивать аннотации параметров (которые являются статическими) с выражениями (которые являются динамическими), потому что статический анализ кода не может предвидеть, что динамическое выражение разрешит во время выполнения.Это, вероятно, маловероятно, но теоретически могут быть условия в выражении.В любом случае, он не может определить во время анализа, что выражение предоставит значение для #args[1] во время выполнения (это может, конечно, для этого простого случая, но не все случаи такие простые).

Использовать один или другой;используйте ваш второй подход или

Integer add(@Payload final int a, @Header("operand") final int b);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...