Я пытаюсь прочитать текущий ответ и пытаюсь перезаписать ответ новыми данными.Но в настоящее время я не могу этого сделать.Я всегда получаю исключение, что GetWriter уже называется
Вот что я пытаюсь сделать
Я хотел бы прочитать из ответа, изменить его и написать новый ответв фильтре.Я не смог бы сделать это нормально, так как процесс обрабатывается swagger-springfox.Причина, по которой я ищу этот подход, состоит в том, чтобы иметь элемент xml, который генерируется в APIDOC для удаления.Я понимаю, что это один раз и, вероятно, есть некоторые проблемы с конфигурацией, но есть слишком много файлов для сканирования и определения, где проблема.Поэтому я решил пойти с этим подходом.Более подробная информация доступна по этой ссылке - https://github.com/springfox/springfox/issues/2821
В строке, которую я печатаю, - она работает отлично, но ответ никогда не отправляется клиенту, потому что кажется, что getWriter () ответалибо уже вызван, либо закрывается.
Вот пример строки JSON, которую вы могли бы - String s = " <Json>{ \"id\": 1, \"itemName\": \"theItem \", \"owner\": { \"id\": 2, \"name\": \"theUser\" }} </Json>";
Вот мой фильтр
public class SwaggerFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
if (req.getRequestURI().toLowerCase().endsWith("someURL")) {
try {
ResponseWrapper wrapperResponse = new ResponseWrapper(res);
chain.doFilter(req, wrapperResponse);
String responseContent = new String(wrapperResponse.getDataStream());
System.out.println("response obtained:" + responseContent);
try {
List<String> s13 = Stream.of(responseContent).filter((s1) -> s1.contains("<Json>"))
.map((sample) -> Arrays.asList(sample.split(" ")))
.flatMap((listString) -> {
StringBuffer sb = new StringBuffer();
listString.forEach(item -> {
sb.append(item);
});
return Stream.of(sb.toString().trim().replace("<Json>", "").replace("</Json>", ""));
}).collect(Collectors.toList());
s13.forEach(item -> System.out.println("items :" + item));
String s14 = String.join("", s13);
System.out.println("tt" + s14);
PrintWriter writer = wrapperResponse.getWriter();
writer.write(s14);
writer.close();
} catch (Exception e) {
System.out.println(e.getLocalizedMessage());
}
} finally {
}
}
chain.doFilter(req, res);
}
}
ЭтоservletoutputStream
public class FilterServletOutputStream extends ServletOutputStream {
ByteArrayOutputStream bos;
public FilterServletOutputStream(OutputStream output) {
bos = (ByteArrayOutputStream) output;
}
@Override
public boolean isReady() {
// TODO Auto-generated method stub
return false;
}
@Override
public void setWriteListener(WriteListener listener) {
// TODO Auto-generated method stub
}
@Override
public void write(int b) throws IOException {
// TODO Auto-generated method stub
bos.write(b);
}
@Override
public void write(byte[] arg0, int arg1, int arg2) throws IOException {
bos.write(arg0, arg1, arg2);
}
@Override
public void write(byte[] arg0) throws IOException {
bos.write(arg0);
}
}
Это ответ Wrapper
public class ResponseWrapper extends HttpServletResponseWrapper {
ByteArrayOutputStream output;
FilterServletOutputStream filterOutput;
public ResponseWrapper(HttpServletResponse response) {
super(response);
output = new ByteArrayOutputStream();
// TODO Auto-generated constructor stub
}
@Override
public ServletOutputStream getOutputStream() {
if (filterOutput == null) {
filterOutput = new FilterServletOutputStream(output);
}
return filterOutput;
}
public byte[] getDataStream() {
return output.toByteArray();
}
}
Ошибка:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'server.servlet.contextPath' in value "${server.servlet.contextPath}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:172) ~[spring-core-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124) ~[spring-core-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:237) ~[spring-core-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:211) ~[spring-core-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.lambda$processProperties$0(PropertySourcesPlaceholderConfigurer.java:175) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:834) ~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1086) ~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065) ~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:584) ~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91) ~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:373) ~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE]
... 22 common frames omitted
Не могли бы вы определить причину проблемы и помочь в написании нового ответаданные и отправить их?
ОБНОВЛЕНИЕ: Я переписал большинство из них.вот кодКаким-то образом ответный документ становится пустым.Я чувствую, что почти смог взломать это.Может ли кто-нибудь помочь мне в конце?
@Component
@Order(2)
public class DumpFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
ByteArrayPrinter pw = new ByteArrayPrinter();
HttpServletResponse wrappedResp = new HttpServletResponseWrapper(response) {
@Override
public PrintWriter getWriter() {
return pw.getWriter();
}
@Override
public ServletOutputStream getOutputStream() {
return pw.getStream();
}
};
System.out.println("before chaingin");
chain.doFilter(httpRequest, wrappedResp);
byte[] bytes = pw.toByteArray();
String respBody = new String(bytes);
if (respBody.startsWith("<Json>")) {
System.out.println("in if");
List<String> s13 = Stream.of(respBody).filter((s1) -> s1.contains("<Json>"))
.map((sample) -> Arrays.asList(sample.split(" ")))
.flatMap((listString) -> {
StringBuffer sb = new StringBuffer();
listString.forEach(item -> {
sb.append(item);
});
return Stream.of(sb.toString().trim().replace("<Json>", "").replace("</Json>", ""));
}).collect(Collectors.toList());
s13.forEach(item -> {
System.out.println("items in list:" + item);
try {
response.getOutputStream().write(item.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
});
// String s14 = String.join("", s13);
// System.out.println("s14" + s14.getBytes());
// bytes = s14.getBytes();
// response.getOutputStream().write(s14.getBytes());
} else {
response.getOutputStream().write(bytes);
}
System.out.println("RESPONSE -> " + new String(bytes));
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
вот вспомогательные классы, которые используются:
public class ByteArrayPrinter {
private ByteArrayOutputStream baos = new ByteArrayOutputStream();
private PrintWriter pw = new PrintWriter(baos);
private ServletOutputStream sos = new ByteArrayServletStream(baos);
public PrintWriter getWriter() {
return pw;
}
public ServletOutputStream getStream() {
return sos;
}
byte[] toByteArray() {
return baos.toByteArray();
}
}
public class ByteArrayServletStream extends ServletOutputStream {
ByteArrayOutputStream baos;
ByteArrayServletStream(ByteArrayOutputStream baos) {
this.baos = baos;
}
@Override
public void write(int param) throws IOException {
baos.write(param);
}
@Override
public boolean isReady() {
// TODO Auto-generated method stub
return false;
}
@Override
public void setWriteListener(WriteListener listener) {
// TODO Auto-generated method stub
}
}
При вызове v2 / api-docs? GroupName = XXXXXX, яя заканчиваю с ошибкой - ошибка в строке 1 в столбце 1: документ пуст