2014-10-31 11 views
5

Die folgenden Abhängigkeiten werden aus dem Maven zentralen Repository in diesem Beispiel verwendet:Wie können Sie die HAPI-Validierungsregeln für Telefonnummern ändern?

<!-- provides HAPI library --> 
<dependency> 
    <groupId>ca.uhn.hapi</groupId> 
    <artifactId>hapi-base</artifactId> 
    <version>2.2</version> 
</dependency> 
<!-- provides HAPI library message version --> 
<dependency> 
    <groupId>ca.uhn.hapi</groupId> 
    <artifactId>hapi-structures-v22</artifactId> 
    <version>2.2</version> 
</dependency> 

<!-- provides ByteString --> 
<dependency> 
    <groupId>com.typesafe.akka</groupId> 
    <artifactId>akka-actor_2.10</artifactId> 
    <version>2.3.3</version> 
</dependency> 

Hier ein Beispiel für meine Parsing-Code ist, in scala geschrieben:

import akka.util.ByteString 
    import ca.uhn.hl7v2.model.Message 
    import ca.uhn.hl7v2.model.v22.datatype.{CM_PAT_ID, ST, TN, TSComponentOne} 
    import ca.uhn.hl7v2.model.v22.segment.{EVN, MRG, PID} 
    import ca.uhn.hl7v2.parser.CanonicalModelClassFactory 
    import ca.uhn.hl7v2.{DefaultHapiContext, ErrorCode, HL7Exception} 

    lazy val parser = { 
    val context = new DefaultHapiContext() 
    context.setModelClassFactory(new CanonicalModelClassFactory("2.2")) 
    context.getGenericParser 
    } 

    def parseHL7Message(message: ByteString) = Try[Message] { 
    val msg: String = message.utf8String.trim 
    parser.parse(msg) 
    } 

Dieser Code die erfolgreich analysieren kann folgende HL7-Nachricht.

"MSH|^~\\&|XXXX|S|XXXXXX|S|201410280931||ADT^A31|123456|P|2.2\r" + 
"EVN|A31|201410280930\r" + 
"PID|||9999999^^^S^MR~88888888^^^^PI||xxxx^xxxxxxxxx||11111111||||||(123)456-7890\r" + 
"PV1\r" 

Wenn jedoch eine Telefonnummer mit einer Erweiterung in der Nachricht geliefert wird, schlägt der hapi Parser die Nachricht zu analysieren. Hier ist ein Beispiel der Eingangsnachricht I mit einer Erweiterung in der Telefonnummer zu analysieren versuchen:

"MSH|^~\\&|XXXX|S|XXXXXX|S|201410280931||ADT^A31|123456|P|2.2\r" + 
"EVN|A31|201410280930\r" + 
"PID|||9999999^^^S^MR~88888888^^^^PI||xxxx^xxxxxxxxx||11111111||||||(123)456-7890 1\r" + 
"PV1\r" 

Den Versuch, diese Nachricht zu analysieren, schlägt mit der folgenden Fehlermeldung:

ca.uhn. hl7v2.validation.ValidationException: Validierung fehlgeschlagen: Primitive Wert ‚(123)456-7890 1‘ erfordert bei PID-13 leer oder einer US-Telefon Zahl seiner

ich alles lese ich beifinden konnte 362489119642, um nach Dokumentation zu suchen, wie die Validierungsregeln geändert werden können, aber nichts Nützliches gefunden haben.

Ein Beispiel würde am meisten geschätzt werden, aber sogar auf die richtige Dokumentation verweisen, oder ein einfaches Arbeitsbeispiel Projekt wird ausreichen.

Wie können die vom HAPI-Parser verwendeten Validierungsregeln so konfiguriert werden, dass eine Telefonnummer in einer gültigen US-Telefonnummer im Feld PID-13 enthalten ist?

EDIT

Mit ein wenig mehr suchen, durch diese hapi Entwickler-Mailingliste thread, habe ich herausgefunden, wie die Validierung vollständig zu deaktivieren. Hier ein Beispiel:

lazy val parser = { 
    val context = new DefaultHapiContext() 
    context.setModelClassFactory(new CanonicalModelClassFactory("2.2")) 
    context.setValidationContext(new NoValidation) 
    context.getGenericParser 
    } 

Aber wenn möglich, möchte ich weiterhin die Nachrichten validieren. Wenn ich die Validierung deaktivieren muss, denke ich, dass das funktionieren muss, aber ich würde lieber angeben, dass die Validierung aktiviert bleibt, aber diese Telefonnummern können Erweiterungen enthalten.

Antwort

3

Ich muss mit Drittanbieter-Dienst arbeiten, und dieser Dienst sendet mir ungültige Telefone. Leider kann ich nicht verstehen, wie man es als "Best Practice" macht. Aber ich fand einen Hack:

@PostConstruct 
public void postConstruct() { 
    List<RuleBinding<PrimitiveTypeRule>> rules = ((ValidationContextImpl)applicationRouter.getParser().getHapiContext().getValidationContext()).getPrimitiveRuleBindings(); 
    //initially was published with this line, but think it was mistake 
    //for(int i = rules.size() - 1; i > 0; i--) { 
    for(int i = rules.size() - 1; i >= 0; i--) { 
     RuleBinding<PrimitiveTypeRule> item = rules.get(i); 
     if("TN".equals(item.getScope())){ 
      rules.remove(i); 
     } 
    } 
} 

Wenn jemand mehr guten Weg, um es zu lösen wissen, schreiben Sie bitte.

2

Telefonnummern können Erweiterungen enthalten. Das Problem ist, dass Sie die Erweiterung im falschen Format haben. Siehe HL7 Messaging Standard Version 2.2, Abschnitt 2.8.10.9. Telefonnummern müssen im folgenden Format sein.

[NN] [(999)]999-9999[X99999][B99999][C any text] 

Setzen Sie die Erweiterung nach dem 'X'.

+0

Während diese Antwort ist es schön, Informationen zu haben. Wir haben keinen Zugriff, um die Erweiterung zu ändern. Die HL7-Nachricht wird zur Verwendung durch eine dritte Partei gesendet. – axiopisty

+0

Wenn die sendende Anwendung defekt ist, müssen Sie benutzerdefinierten Code schreiben, um die fehlerhaften Daten zu bereinigen. HAPI kann dieses Problem nicht für Sie lösen. –

+0

Einverstanden. Unsere Anwendung ist jedoch nicht die Quelle der Wahrheit für diese Daten. Es ist zwar nicht Aufgabe der HAPI, das Problem zu lösen, aber es wäre schön, wenn HAPI mit schlechten Spielern gut spielen würde. Ich bin nur neugierig, ob es möglich ist, eine benutzerdefinierte Überprüfung für dieses Szenario zu aktivieren, obwohl es kein gültiges HL7-Nachrichtenformat ist. – axiopisty

Verwandte Themen