#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
просто usewriter.newLine()
.