【问题标题】:BufferedReader + BufferedWriter RESTful web service in wildfly 19Wildfly 19 中的 BufferedReader + BufferedWriter RESTful Web 服务
【发布时间】:2021-01-14 14:31:55
【问题描述】:

我有一段代码

@RequestScoped
@Path("test")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_XML)
public class Test {
    private static final Logger LOG = Logger.getLogger(Test.class.toString());

    @POST
    public Response createRequest(InputStream request) throws IOException {
        char[] buff = new char[1024];
        int in = 0;
        BufferedReader reader = new BufferedReader(new InputStreamReader(request));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out, "UTF-8"));
        try {
            while ((in = reader.read(buff)) != -1) {
                //writer.write(buff);
                writer.write(buff, 0, in);

            }
        } finally {
            writer.flush();
            writer.close();
            reader.close();
        }
        return Response.ok().build();
    }
}

问题是这个服务写入输出不完整的xml,即

输入

<note>
   <to>Tove</to>
   <from>Jani</from>
   <heading>Reminder</heading>
   <body>Don't forget me this weekend!</body>
</note>

输出

04:55:44,190 INFO  [stdout] (default task-1) <note>
04:55:44,191 INFO  [stdout] (default task-1) <to>Tove</to>
04:55:44,191 INFO  [stdout] (default task-1) <from>Jani</from>
04:55:44,198 INFO  [stdout] (default task-1) <heading>Reminder</heading>
04:55:44,198 INFO  [stdout] (default task-1) <body>Don't forget me this weekend!</body>

失踪

注>

...为什么?

当我第二次尝试发送请求时,控制台是空的,我需要重新启动 Wildfly 才能将不完整的 xml 输出...为什么?

注意:

控制台没有错误

【问题讨论】:

    标签: java rest wildfly


    【解决方案1】:

    好吧,经过长时间的失败,我找到了为什么它不起作用......而且有点令人不安......

    所以...工作示例

    @RequestScoped
    @Path("test")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_XML)
    public class ConnectorResourceV1 {
        private static final Logger LOG = Logger.getLogger(ConnectorResourceV1.class.toString());
    
        @POST
        public Response test(InputStream request) throws IOException {
            char[] buff = new char[16 * 1024];
            int in = 0;
            int lastIn = 0;
            BufferedReader read = new BufferedReader(new InputStreamReader(request));
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
        while ((in = read.read(buff)) != -1) {
            writer.write(buff, lastIn, in);
            if (in < buff.length) {
                if (in == 0) {
                    lastIn = in;
                } else {
                    lastIn = lastIn + in;
                }
            }
        }
            writer.write("\r\n");
            writer.flush();
            return Response.ok().build();
        }
    }
    

    注意 writer.write("\r\n"); 它必须在此处并且接缝表明它是流终止表达式??

    另外,因为我使用 System.out 作为我的输出,所以我不需要关闭它,否则您将不会在控制台会话中看到输出。

    一次非常令人不安的经历...

    【讨论】:

    • 请使用 System.lineSeparator() 而不是 ("\r\n")。它也适用于其他操作系统。
    • 哇,不知道这也可以,我认为 ("\r\n") 是特定于 http 协议的。感谢您的洞察力
    • 这是因为System.out 被包裹在一个寻找新行终止符的记录器中。由于您使用的是BufferedWriter,因此请使用writer.newLine()
    猜你喜欢
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多