Struts2 setter 方法 POST 参数带破折号

Struts2 setter method for POST parameter with dash

我有 mailgun.com 路由将电子邮件 POST 转发到我的 Struts2 操作。 mailgun POST 请求内容在某些参数名称中有破折号:sender, subject (OK) 但我如何映射 setter 我的 Struts2 操作中 POST 参数的方法:body-plain(包含破折号)、body-htmlmessage-headersContent-Type ?

我已经试过了,但是不行 bodyPlain=null:

public class MyAction extends ActionSupport {

    private String sender;
    private String subject;
    private String bodyPlain;

    public String execute() {

        LOG.info(sender);
        LOG.info(subject);
        LOG.info(bodyPlain);
        return SUCCESS;
    }
    public void setSender(String sender) {
        this.sender = sender;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public void setBodyPlain(String bodyPlain) {
        this.bodyPlain = bodyPlain;
    }
}

然后您需要将 body-plain 重命名为 bodyPlain 以将参数映射到操作字段。 Java 和命名约定对 classes 使用 camelCased 实例变量。这是将请求参数映射到操作的强制性规则 class.

你可以translate/rename他们在任何级别,过滤器,url-重写规则,拦截器等。任何方式参数传递给ActionContext是一个地图,然后如果您尝试

,遍历地图并从键名中删除破折号会很容易
Map<String, Object[]> parameters =  ActionContext.getContext().getParameters();

我无法更改 mailgun 服务代码。这是我处理 Struts2 命名约定的代码。如果它有更干净的解决方案来解决这个问题,请告诉我。

public class MyAction extends ActionSupport implements ParameterAware {

        private String sender;
        private String subject;
        private String bodyPlain;

        public String execute() {
            LOG.info(sender);
            LOG.info(subject);
            LOG.info(bodyPlain);
            return SUCCESS;
        }

        public void setSender(String sender) {
            this.sender = sender;
        }

        public void setSubject(String subject) {
            this.subject = subject;
        }

        @Override
        public void setParameters(Map<String, String[]> parameters) {
            if (parameters != null) {
                for (Map.Entry<String, String[]> entry : parameters.entrySet()) {
                    String key = entry.getKey();
                    String[] value = entry.getValue();
                    if(key.equals("body-plain") && value.length > 0) this.bodyPlain = value[0];
                    LOG.info("key:" + key + " value:" + Arrays.toString(value));
                }
            }
        }
    }