Invocation.Builder Java如何将JSON发布为字符串而不是实体

时间:2019-04-17 12:39:30

标签: java json

使用Java中的Invocation Builder,放置/发布的唯一选项是Entity,因为它是从以下位置获取json的对象:

    public <T> T put(final Entity<?> entity, final Class<T> responseType)

如果字符串中已经包含json,有什么方法可以放置/发布它,而不必将其转换为Entity(我们假设这只是一个对象)

String payload = "{\"name\":\"hello\"}";

WebTarget webTarget = theHttpClient.target(url);
Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON)
                .header(HttpUtils.AUTHORISATION_HEADER_NAME, "Bearer " + theAccessToken); 

// this outputs the string with slashes, i.e. "{\n\"name\":\"hello\"\n}"; instead of {"name":"hello"}
invocationBuilder.put( Entity.json(theObjectMapper.writeValueAsString(payload)), responseClass);

// this will not compile as payload is not an Entity
invocationBuilder.put(payload, responseClass);

1 个答案:

答案 0 :(得分:1)

我进行了快速测试,我认为您的错误来自于您直接在此处调用对象映射器

  

Entity.json(theObjectMapper.writeValueAsString(payload))

通过快速测试,如果您仅传递有效负载字符串而不调用对象映射器,则它似乎可以工作

pom.xml

    <dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>2.28</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
        <version>2.28</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.8.3</version>
    </dependency>
</dependencies>

testInvocationBuilder.java

public class testInvocationBuilder
{
    public static void main(String[] args)
    {
        Client client = ClientBuilder.newClient().register(JacksonJaxbJsonProvider.class);
        WebTarget webTarget = client.target("http://127.0.0.1:8000");

        Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);

        Payload p = new Payload();
        p.name = "hello-there";

        //this serializes the object in the request
        Response payloadRsp = invocationBuilder.put(Entity.entity(p, MediaType.APPLICATION_JSON));
        System.out.println(payloadRsp);

        //this seems to pass through
        String payload = "{\"name\":\"hello\"}";
        Response stringRsp = invocationBuilder.put(Entity.entity(payload, MediaType.APPLICATION_JSON));
        System.out.println(stringRsp);
    }

    public static class Payload {
        public String name;
    }
}