我不明白为什么我不能将object.getter()添加到MultivaluedMap

时间:2016-03-10 08:46:37

标签: java jersey-client multivalue

我尝试使用一些参数发送POST请求。为此,我形成了MultivaluedMap

如果我将此添加到MultivaluedMap

String ban = subscriber.getBan();
String username = user.getUsername();
postData.add("agent", username);
postData.add("datasource", "online");
postData.add("accountId", ban);
String json = RESTUtil.doPost(url, postData);

一切正常

但如果我这样做

postData.add("agent", user.getUsername());
postData.add("datasource", "online");
postData.add("accountId", subscriber.getBan());
String json = RESTUtil.doPost(url, postData);

我有错误:

  

com.sun.jersey.api.client.ClientHandlerException:java.lang.ClassCastException:java.lang.String无法强制转换为java.util.List

这是我的帖子方法

public static String doPost(String url, MultivaluedMap formData) {
        try {
            Client client = Client.create();
            WebResource wr = client.resource(url);
            client.setConnectTimeout(CONNECTION_TIMEOUT);
            client.setReadTimeout(READ_TIMEOUT);
            ClientResponse response2 = wr
                    .accept("application/json;")
                    .type("application/x-www-form-urlencoded; charset=UTF-8")
                    .post(ClientResponse.class, formData);
            if (response2.getStatus() != 200) {
                throw new RuntimeException("Failed : HTTP error code : " + response2.getStatus());
            }
            return response2.getEntity(String.class);
        } catch (Exception e) {
            LOG.log(Level.WARNING, "callRestUrl:", e);
            JsonObject jo = new JsonObject();
            jo.addProperty("resultCode", "EXCEPTION");
            jo.addProperty("details", e.getMessage());
            return GSON.toJson(jo);
        }
    }

在第二种情况下,我在.post之后得到错误(ClientResponse.class,formData);

我不明白出了什么问题。 subscriber.getBan()user.getUsername()返回banusername之类的字符串,但如果我使用getter,则会出错。

第2部分。我发现了这篇文章this article

但我不明白何时使用addput及其差异?

1 个答案:

答案 0 :(得分:0)

您能否明确说明如何创建MultivaluedMap的实例?你是怎么用的?

MultivaluedMap是一对键(单值)和值(对象列表)。见声明:

public interface MultivaluedMap<K,V> extends Map<K,List<V>>

我认为您的两个片段在同一段代码中按顺序使用。在第一种情况下,您初始化键'ban'的值(这意味着:值是一个元素的列表),在第二种情况下,您将列表中的值添加到相同的键'ban'。密钥“用户名”的情况完全相同。 我是你的第一种情况,Java自动将列表(一个值)捕获到一个字符串,在第二个add之后,这不是这种情况。

要验证它,您只需更改顺序(首先执行第二种情况,然后执行第一种情况)。在第二次之后你应该得到同样的错误。

要解决您的问题,请考虑使用方法putSingle而不是添加,如果您要“更新/替换”该值,或重新启动您的formData实例(formData = new .. 。)再使用它之前。