[SPRING] HttpServletRequest에서 XML 가져 오기 및 끝점에 사용
SPRINGHttpServletRequest에서 XML 가져 오기 및 끝점에 사용
요청 및 응답에서 XML 데이터를 가져와 Rest 컨트롤러에 사용하고 싶습니다. 나는 이것을 시도 :
@RestController()
public class HomeController {
@PostMapping(value = "/v1")
public Response handleMessage(@RequestBody Transaction transaction, HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest request, HttpServletResponse response
System.out.println("!!!!!!! InputStream");
System.out.println(request.getInputStream());
System.out.println(response.getOutputStream());
InputStream in = request.getInputStream();
String readLine;
BufferedReader br = new BufferedReader(new InputStreamReader(in));
while (((readLine = br.readLine()) != null)) {
System.out.println(readLine);
}
}
}
하지만 java.io.IOException 얻을 : UT010029 : 스트림 닫힙니다.
문자열 변수에 내용을 가져 오는 적절한 방법은 무엇입니까?
편집 : 나는 또한 필터를 사용하여 솔루션을 시도했지만 나머지 컨트롤러에 요청 페이로드를 사용하는 방법을 알지 못합니다.
읽기 요청 페이로드 :
@Component
public class HttpLoggingFilter implements Filter {
private static final Logger logger = LoggerFactory.getLogger(HttpLoggingFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
ResettableStreamHttpServletRequest wrappedRequest = new ResettableStreamHttpServletRequest((HttpServletRequest) request);
wrappedRequest.getInputStream().read();
String body = IOUtils.toString(wrappedRequest.getReader());
System.out.println("!!!!!!!!!!!!!!!!!! " + body);
wrappedRequest.resetInputStream();
chain.doFilter(request, response);
}
public class ResettableStreamHttpServletRequest extends HttpServletRequestWrapper {
private byte[] rawData;
private HttpServletRequest request;
private ResettableServletInputStream servletStream;
ResettableStreamHttpServletRequest(HttpServletRequest request) {
super(request);
this.request = request;
this.servletStream = new ResettableServletInputStream();
}
void resetInputStream() {
servletStream.stream = new ByteArrayInputStream(rawData);
}
@Override
public ServletInputStream getInputStream() throws IOException {
if (rawData == null) {
rawData = IOUtils.toByteArray(this.request.getInputStream());
servletStream.stream = new ByteArrayInputStream(rawData);
}
return servletStream;
}
@Override
public BufferedReader getReader() throws IOException {
if (rawData == null) {
rawData = IOUtils.toByteArray(this.request.getInputStream());
servletStream.stream = new ByteArrayInputStream(rawData);
}
String encoding = getCharacterEncoding();
if (encoding != null) {
return new BufferedReader(new InputStreamReader(servletStream, encoding));
} else {
return new BufferedReader(new InputStreamReader(servletStream));
}
}
private class ResettableServletInputStream extends ServletInputStream {
private InputStream stream;
@Override
public int read() throws IOException {
return stream.read();
}
@Override
public boolean isFinished() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isReady() {
// TODO Auto-generated method stub
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
// TODO Auto-generated method stub
}
}
}
}
나머지 끝점 :
@RestController()
public class HomeController {
@PostMapping(value = "/v1")
public Response handleMessage(@RequestBody Transaction transaction, HttpServletRequest request, org.zalando.logbook.HttpRequest requestv, HttpServletResponse response) throws Exception {
// Get here request and response and log it into DB
}
}
HttpLoggingFilter를 Java 메소드 handleMessage에 호출하여 본문 문자열로 요청을받을 수있는 방법은 무엇입니까? 아마 내가 서비스하고 주사 할 수 있을까? 코드를 평가할 수있는 조언을 해줄 수 있습니까?
해결법
from https://stackoverflow.com/questions/53461617/get-xml-from-httpservletrequest-and-use-into-endpoint by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 왜 @Service가 bean을 만들지 않는 것처럼 클래스에 주석을 붙이겠습니까? (0) | 2019.05.24 |
---|---|
[SPRING] @RequestMapping이 올바르게 매핑되지 않았습니다. (0) | 2019.05.24 |
[SPRING] 하위 리소스에 HATEOAS 링크를 추가하는 방법 (0) | 2019.05.24 |
[SPRING] 스프링 문제가있는 Ajc 컴파일러 사용하기 AspectJ (0) | 2019.05.24 |
[SPRING] 스프링 부트 로그백 DB 애 퍼더 속성 (0) | 2019.05.24 |