2017-09-18 16 views
0

여러 계층으로 나뉘어 진 MULE REST 서비스를 프로그래밍하고 있습니다.MULE 3.7.0 C.E. - BufferInputStream 페이로드가 문자열로 변합니다.

API 계층 (RAML 기반)은 인바운드 요청을 받고 일부 하위 클래스가 진행 방법을 알 수 있도록 일부 flowVars를 준비합니다.

두 번째 레이어도 정의되어 있으므로 각 서비스에 대해 하나의 흐름이 있습니다.

마지막으로 세 번째 계층은 고유 한 흐름을 포함하며 상위 계층에 구성된 flowVars에 따라 HTTP 요청 구성 요소를 사용하여 필요한 타사 서비스에 대한 호출을 수행합니다.

이 세 번째 계층에서 일부 감사 기록은 우리가 전송하는 정보와 수신중인 정보를 확인하기 위해 작성됩니다. 따라서 감사 구성 요소 (사용자 지정 MULE 커넥터)는 페이로드 콘텐츠를 데이터베이스에 쓸 필요가 있으므로 message.getPayloadAsString() (또는 이와 비슷한)이 필요합니다. 깨끗한 게터 (예 : message.getPayload())를 사용하면 데이터 형식 만 가져와 데이터베이스에 기록됩니다.

여기에 문제가 있습니다. 받은 모든 페이로드는 BufferInputStream 인 것 같습니다. message.getPayloadAsString()을 수행하면 내부 캐스팅이 페이로드에 영향을 미치는 것 같습니다. 이것은 우리가 발견 한 경우를 제외하고는 문제가되지 않을 것입니다. 우리가 호출하는 서비스 중 하나가 PNG 파일을 반환하므로 message.getPayloadAsString()은이를 문자열로 변환하고 이미지를 분리합니다.

캐스팅에서 사본 중 하나를 안전하게 유지하기 위해 페이로드를 복제하려했지만 Object로서 Cloneable 인터페이스를 구현하지 않았습니다. 우리는 다른 단일 방법으로 페이로드 사본을 만들려고했지만 새로운 참조 만 생성됩니다. 우리는 직렬화 된 데이터에서 새로운 복사본을 생성하기 위해 페이로드를 직렬화하려고 시도했지만 Object는 Serializable 인터페이스를 구현하지 않습니다 ... 쓸모없는 모든 것.

도움, 아이디어 또는 조언을 주시면 감사하겠습니다.

+0

감사합니다. @AndrewKoropets가 게시물의 서식을 편집합니다. 나는 그것이 잘못되었다는 사실조차 알지 못했다. :-) –

답변

0

우리는 결국 message.getPayloadAsBytes();을 사용하여 문제를 해결할 수있었습니다. 반환 값은 새로운 byte [] 객체입니다. 이 방법은 메시지 내의 페이로드를 변경하지 않습니다. 바이트 배열을 사용하여 우리는 다음과 같이 우리의 감사에 기록되는 String 객체를 생성 할 수 있습니다 :

byte[] auditByteArray[] = message.getPayloadAsBytes(); 
String auditString = new String(auditByteArray); 

을 또한, 우리는 메시지의 새로운 페이로드 모두 JSON과 같은 그 바이트 배열을 stablishing에 구성된 테스트를 시도 PNG 응답은 브라우저에서 올바르게 관리합니다.