2014-07-13 14 views
0

OpenMRS 모듈 용 HAPI 2.0 라이브러리를 사용하여 ORU_R01 유형의 HL7 메시지를 인코딩하려고합니다. 나는 HAPI 문서에있는 튜토리얼을 따라 갔고, 그에 따라 ORU_R01 메시지의 필수 필드를 채웠다. 지금, 나는 다음과 같은 링크를 사용하여이 메시지를 게시 할 : 나는 테스트를 위해 다음과 같은 메시지를 사용하고다음 HL7 인코딩의 오류는 무엇입니까?

http://localhost:8080/openmrs/remotecommunication/postHl7.form 

:

MSH|^~\&|||||20140713154042||ORU^R01|20140713154042|P|2.5|1 
PID|||1 
OBR|1||1234^SensorReading|88304 
OBX|0|NM|1||45 
OBX|1|NM|2||34 
OBX|2|NM|3||23 

내가 제대로 모든 매개 변수가 올바른지 보장했다. HL7 메시지를 게시하면 스케줄러에서 HL7 작업을 시작합니다. 그런 다음 관리자 페이지로 이동하여 "HL7 오류 관리"를 클릭하여 메시지가 도착했는지 확인합니다.

ca.uhn.hl7v2.HL7Exception: HL7 encoding not supported 
... 


Caused by: ca.uhn.hl7v2.parser.EncodingNotSupportedException: Can't parse message beginning MSH|^~\ 
at ca.uhn.hl7v2.parser.Parser.parse(Parser.java:140) 

전체 스택 추적이 여기에 있습니다 : : http://pastebin.com/ZnbFqfWC 나는 다음과 같은 스택 추적을 얻을. 나는 HL7 메시지합니다 (HAPI 라이브러리를 사용) 인코딩하려면 다음 코드를 작성했습니다 : 모든 가능성에

public String createHL7Message(int p_id, int concept_id[], String val[]) 
      throws HL7Exception { 

    ORU_R01 message = new ORU_R01(); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss", 
      Locale.ENGLISH); 
    MSH msh = message.getMSH(); 
    msh.getFieldSeparator().setValue("|"); 
    msh.getEncodingCharacters().setValue("^~\\&"); 
    msh.getProcessingID().getProcessingID().setValue("P"); 
    msh.getSequenceNumber().setValue("1"); 
    msh.getMessageType().getTriggerEvent().setValue("R01"); 
    msh.getMessageType().getMessageCode().setValue("ORU"); 
    msh.getVersionID().getVersionID().setValue("2.5"); 
    msh.getMessageControlID().setValue(
      sdf.format(Calendar.getInstance().getTime())); 
    msh.getDateTimeOfMessage().getTime() 
      .setValue(sdf.format(Calendar.getInstance().getTime())); 


    ORU_R01_ORDER_OBSERVATION orderObservation = message 
      .getPATIENT_RESULT().getORDER_OBSERVATION(); 
    ca.uhn.hl7v2.model.v25.segment.PID pid = message.getPATIENT_RESULT() 
      .getPATIENT().getPID(); 

    Patient patient = (Patient) Context.getPatientService() 
      .getPatient(p_id); 
    System.out.println(String.valueOf(p_id) + " " + patient.getGivenName() 
      + " " + patient.getFamilyName()); 

    pid.getPatientName(0).getFamilyName().getSurname() 
      .setValue(patient.getFamilyName()); 
    pid.getPatientName(0).getGivenName().setValue(patient.getGivenName()); 
    pid.getPatientIdentifierList(0).getIDNumber() 
      .setValue(String.valueOf(p_id)); 

    System.out.println(); 
    // Parser parser = new PipeParser(); 
    // String encodedMessage = null; 
    // encodedMessage = parser.encode(message); 
    // System.out.println(encodedMessage); 

    // Populate the OBR 
    OBR obr = orderObservation.getOBR(); 
    obr.getSetIDOBR().setValue("1"); 
    obr.getFillerOrderNumber().getEntityIdentifier().setValue("1234"); 
    obr.getFillerOrderNumber().getNamespaceID().setValue("SensorReading"); 
    obr.getUniversalServiceIdentifier().getIdentifier().setValue("88304"); 
    Varies value = null; 
    // Varies value[] = new Varies[4]; 
    for (int i = 0; i < concept_id.length; i++) { 
     ORU_R01_OBSERVATION observation = orderObservation 
       .getOBSERVATION(i); 
     OBX obx2 = observation.getOBX(); 
     obx2.getSetIDOBX().setValue(String.valueOf(i)); 
     obx2.getObservationIdentifier().getIdentifier() 
       .setValue(String.valueOf(concept_id[i])); 
     obx2.getValueType().setValue("NM"); 
     NM nm = new NM(message); 
     nm.setValue(val[i]); 

     value = obx2.getObservationValue(0); 
     value.setData(nm); 
    } 
    Parser parser = new PipeParser(); 
    String encodedMessage = null; 
    encodedMessage = parser.encode(message); 
    return encodedMessage; 

} 

을, 뭔가 메시지의 MSH 세그먼트에 문제가 있습니다,하지만 난 그게 무엇을 알아낼 수 없습니다 입니다. 이 오류를 해결하려면 어떻게해야합니까?

답변

0

이중 백 슬래시를 사용하여 인코딩 문자를 선언하는 이유는 무엇입니까?

msh.getEncodingCharacters().setValue("^~\\&");

그것은해야하지 :

msh.getEncodingCharacters().setValue("^~\&");

... 그리고 당신의 메시지가 아마 기본 인코딩 문자를 사용하고 있기 때문에 당신은 심지어 그들 모두를 선언 할 필요가 없습니다? HAPI MSH Class reference

getENCODINGCHARACTERS 내가 HAPI 경험이없는

public ST getENCODINGCHARACTERS() 
Returns MSH-2: "ENCODING CHARACTERS" - creates it if necessary 

업데이트에서 추출합니다. 빠른 google은 ORU example입니다. initQuickstart("ORU", "R01", "P");

예제 코드의 주석에 따르면 initQuickstart 메서드는 메시지 유형, 타임 스탬프 및 컨트롤 ID를 포함하여 메시지의 MSH 세그먼트에있는 모든 필수 필드를 채 웁니다 . (... 그리고 잘하면 기본 인코딩 문자도 마찬가지입니다 :-)

+0

msh.getEncodingCharacters(). setValue ("^ ~ \ &");"을 쓰면 "잘못된 이스케이프 시퀀스"오류가 발생합니다. 인코딩 문자를 설정하면 기본 인코딩 문자 만 사용하는 경우에도 인코딩 문자가 설정되지 않았 음을 알리는 HL7 예외가 발생합니다 – Octavarium

+0

@Octavarium 추가 정보로 내 대답을 업데이트했습니다. 도움이 되었기를 바랍니다. – Lars