如果请求方式是http+post+xml, 有没有办法映射为请求对象?

小树鹿鸣 2012-07-22
比如现在请求方式是http + post +xml, 请求内容体直接post一个XML数据,例如:
  <root>
     <appkey>123</appkey>
     <username>abc</username>
     <password>1234</password>
     <methodname>user.add</methodname>
     .........
  <root>


有没有办法直接映射为请求ropRequest对象,pring mvc内置的转换器,是基于key-value转换,求楼主帮忙解决啊?
   
EricLiang 2012-07-23
你可以用xstream将XML转换成JAVA对象,后面的调用都一样了
小树鹿鸣 2012-07-24
这样子的话,真不如直接调用框架实现的converter,框架的测试用例就写好了。
stamen 2012-07-26
可以啊,已经支持了,参见rop-sample的例子:
    @Test
    public void testServiceXmlRequestAttr() {
        RestTemplate restTemplate = new RestTemplate();
        MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>();
        form.add("method", "user.add");//<--指定方法名称
        form.add("appKey", "00001");
        form.add("v", "1.0");
        form.add("sessionId", "mockSessionId1");
        form.add("userName", "tomson");
        form.add("salary", "2,500.00");

        //address会正确绑定
        form.add("address",
                "<address zoneCode=\"0001\" doorCode=\"002\">\n" +
                        "  <streets>\n" +
                        "    <street no=\"001\" name=\"street1\"/>\n" +
                        "    <street no=\"002\" name=\"street2\"/>\n" +
                        "  </streets>\n" +
                        "</address>");

        //对请求参数列表进行签名
        String sign = RopUtils.sign(form.toSingleValueMap(), "abcdeabcdeabcdeabcdeabcde");
        form.add("sign", sign);

        String response = restTemplate.postForObject(
                SERVER_URL, form, String.class);
        System.out.println("response:\n" + response);
        assertTrue(response.indexOf("<createUserResponse createTime=\"20120101010101\" userId=\"1\">") > -1);
    }


这儿,address参数就是一个XML,它会自动绑定到:
public class CreateUserRequest extends AbstractRopRequest {

    @Pattern(regexp = "\\w{4,30}")
    private String userName;

    @IgnoreSign
    @Pattern(regexp = "\\w{6,30}")
    private String password;

    @DecimalMin("1000.00")
    @DecimalMax("100000.00")
    @NumberFormat(pattern = "#,###.##")
    private long salary;

    @Valid
    private Address address;

    private String format;

    private Telephone telephone;
}

的Address成员变量中,注意Address一定要打上@Valid标签哦。
小树鹿鸣 2012-07-30
@stamen, 你还没理解我的意思,我是指post body 就是XML数据,如下所示:
<root>  
   <appkey>123</appkey>  
   <method>abc</method>  
   <sessionId>1234</sessionId>  
   <v>user.add</v>  
   .........  
<root>  

有没有办法,直接绑定到对像中去?
stamen 2012-07-31
小树鹿鸣 写道
@stamen, 你还没理解我的意思,我是指post body 就是XML数据,如下所示:
<root>  
   <appkey>123</appkey>  
   <method>abc</method>  
   <sessionId>1234</sessionId>  
   <v>user.add</v>  
   .........  
<root>  

有没有办法,直接绑定到对像中去?


这个暂时不支持,建议使用HTTP参数的方式。
Global site tag (gtag.js) - Google Analytics