BufferedReader BufferedWriter RESTful веб-служба в wildfly 19

#java #rest #wildfly

#java #отдых #wildfly

Вопрос:

У меня есть фрагмент кода

 @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 в вывод… Почему?

ПРИМЕЧАНИЕ:

Я не получаю никаких ошибок на консоль

Ответ №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("rn");
        writer.flush();
        return Response.ok().build();
    }
}
  

ОБРАТИТЕ внимание на writer.write(» r n»); он должен быть здесь, и он показывает, что это выражение, завершающее поток??

Кроме того, поскольку я использую System.out в качестве вывода, мне не нужно его закрывать, иначе вы не увидите вывод в сеансе консоли.

Очень тревожный опыт…

Комментарии:

1. Пожалуйста, используйте System.LineSeparator() вместо (» r n»). Он будет работать и на других операционных системах.

2. вау, не знал, что это тоже сработает, я думал, что (» r n») зависит от протокола http. Спасибо за ваше понимание

3. Это связано System.out с тем, что он завернут в регистратор, ищущий новый терминатор строки. Поскольку вы используете BufferedWriter просто use writer.newLine() .