使 bean 参数可选

Making a bean parameter optional

我有以下路由和 bean 从 属性 文件获取消息。在某些消息中,我必须替换消息中的参数。因此,我一直在寻找一种解决方案,无需在 bean 中编写 2 个方法,一个带有参数 (getMessageWithArgs),第二个不带参数 (getMessage)。

是否可以通过在路由中使用 DSL 来摆脱 bean 中的 getMessageWithArgs 或使 getMessage 中的参数可选,所以我最后在 bean 中有一个方法?

路线

@Override
public void configure() throws Exception {

    from("activemq:queue:1234")
        .setHeader("functionId", simple(FUNCTION_ID))
        .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                Message message = exchange.getIn();
                message.setHeader("messageId", "notice_1234_error_messageBox_1");
//              List<String> arguments = Arrays.asList("Test1", "Test2", "Test3");
//              message.setHeader("arguments", arguments);
            }   
        })
    .setHeader("message").method("messageBean", "getMessage( ${header.functionId}, ${header.messageId})")
    //.setHeader("message").method("messageBean", "getMessageWithArgs( ${header.functionId}, ${header.messageId}, ${header.arguments})") 
    .log("after calling getMessageWithoutValidation: ${body}");
}

豆子

@Component
public class MessageBean {

    public String getMessage(@Header("functionId") String functionId, 
            @Header("messageId") String messageId) {
        //Doing something to get the message
        return message;
    }


    public String getMessageWithArgs(@Header("functionId") String functionId,
            @Header("messageId") String messageId, 
            @Header("arguments") List<String>  arguments) {
        //Doing something to get the message
        return message;
    }
}

我认为 Arbitrary Number of Arguments 可能适合你。

http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs

所以 Bean 现在只有一个:

public String getMessageWithArgs(@Header("functionId") String functionId, 
            @Header("arguments") String... arguments) {
        String messageId = arguments[0];
        //Doing something to get the message
        return message;
    }

我不确定是否可以这样,但这可能是一种可以提供帮助的方法..

如果你的目标是只保留一个方法,那么只保留你有所有参数的方法,知道如果 header arguments 没有被设置,它的值将是 null.

public String getMessage(@Header("functionId") String functionId,
        @Header("messageId") String messageId, 
        @Header("arguments") List<String>  arguments) {
    if (arguments == null || arguments.isEmpty()) {
       // No arguments have been provided
    } else {
       // Arguments have been provided
    }
    return message;
}