qurakus在restclient中序列化“原语”

zpgglvta  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(358)

我正在与quarkus restclient进行斗争。
首先创建一个简单打印请求主体的控制器:例如。

@Path("/test")
    public class ExampleController {
        @PUT
        public void test(String data) {
            System.out.println(data);
        }
    }

现在我们创建一个restclient,它接受任何对象作为请求主体:

@RegisterRestClient(baseUri = "http://localhost:8081/test")
    public interface RestClientExample {
        @PUT
        @Produces(MediaType.APPLICATION_JSON)
        @Consumes(MediaType.APPLICATION_JSON)
        void put(Object data);
    }

请注意我们说 @Consumes(MediaType.APPLICATION_JSON) 因此,在请求过程中,主体应该序列化json。
进行快速测试:

@QuarkusTest
    class TestPrimitives {
        @Inject
        @RestClient
        RestClientExample example;
        @Test
        void test() {
            example.put("hello\nworld");
            example.put(new TestRequest());
        }
        public static class TestRequest {
            private String data = "hello\nworld";
            public String getData() {
                return data;
            }
        }
    }

您将看到:

hello
world
{"data":"hello\nworld"}

如果您发送的任何类型的对象都不是primitve,那么主体将作为json响应。如果发送一个字符串,则正文不是json序列化的(linebreak应该是一个 \n 就像第二个请求)。不幸的是,我还需要字符串序列化。我怎样才能做到?
更新
所以我可以更好地理解:将控制器替换为:所以我们进行json解析。

@PUT
    @Consumes(MediaType.APPLICATION_JSON)
    public void test(String data) {
        System.out.println(Json.createReader(new StringReader(data)).readValue());
    }

这将失败:

Caused by: javax.json.stream.JsonParsingException: Unexpected char 104 at (line no=1, column no=1, offset=0)
    at org.glassfish.json.JsonTokenizer.unexpectedChar(JsonTokenizer.java:577)
bzzcjhmw

bzzcjhmw1#

不幸的是,您告诉您的rest客户机发送json,并且字符串是有效的json对象,因此您的结果是合乎逻辑的。
当您使用system.out记录字符串时 \n 字符显示为换行符。
对我来说,这段代码没有什么问题,它的工作应该是正常的。
如果你真的想要 \n 要不被评估为换行符,需要对 \ 从调用站点(rest客户机代码正常)

@QuarkusTest
class TestPrimitives {
    @Inject
    @RestClient
    RestClientExample example;
    @Test
    void test() {
        example.put("hello\\nworld");
        example.put(new TestRequest());
    }
    public static class TestRequest {
        private String data = "hello\nworld";
        public String getData() {
            return data;
        }
    }
}

相关问题