diff --git a/lib/src/main/java/gdv/xport/satz/Satz.java b/lib/src/main/java/gdv/xport/satz/Satz.java index b4fb6e49..d8a38404 100644 --- a/lib/src/main/java/gdv/xport/satz/Satz.java +++ b/lib/src/main/java/gdv/xport/satz/Satz.java @@ -618,10 +618,7 @@ private BetragMitVorzeichen getBetragMitVorzeichen(final Bezeichner bezeichner) // Das Vorzeichenfeld darf leer sein (s. Issue #95), in diesem Fall ersetzen wir es vor // der Instanziierung von BetragMitVorzeichen durch ein "+", damit die weitere numerische Verarbeitung funktioniert. Feld vorzeichen = getVorzeichenOf(bezeichner); - String vorzeichenInhalt = vorzeichen.getInhalt(); - if (StringUtils.isBlank(vorzeichenInhalt)) { - vorzeichenInhalt = "+"; - } + String vorzeichenInhalt = getValidatedVorzeichenInhalt(vorzeichen); BetragMitVorzeichen bmv = new BetragMitVorzeichen( Bezeichner.of(bezeichner.getName() + " mit Vorzeichen"), betrag.getAnzahlBytes() + 1, ByteAdresse.of(betrag.getByteAdresse()) @@ -630,6 +627,16 @@ private BetragMitVorzeichen getBetragMitVorzeichen(final Bezeichner bezeichner) return bmv; } + private static String getValidatedVorzeichenInhalt(Feld vorzeichen) { + String vorzeichenInhalt = vorzeichen.getInhalt(); + if (StringUtils.isBlank(vorzeichenInhalt)) { + return "+"; + } else if (!vorzeichenInhalt.equals("+") && !vorzeichenInhalt.equals("-")) { + throw new ValidationException("falsches Vorzeichen in " + vorzeichen); + } + return vorzeichenInhalt; + } + private Feld getVorzeichenOf(final Bezeichner bezeichner) { for (int n = 1; n <= getNumberOfTeildatensaetze(); n++) { Teildatensatz tds = getTeildatensatz(n); diff --git a/lib/src/test/java/gdv/xport/satz/SatzTest.java b/lib/src/test/java/gdv/xport/satz/SatzTest.java index 470b479c..43d5d0af 100644 --- a/lib/src/test/java/gdv/xport/satz/SatzTest.java +++ b/lib/src/test/java/gdv/xport/satz/SatzTest.java @@ -34,6 +34,7 @@ import patterntesting.runtime.junit.CollectionTester; import patterntesting.runtime.junit.ObjectTester; +import javax.validation.ValidationException; import java.io.*; import java.math.BigDecimal; import java.util.Collection; @@ -223,6 +224,9 @@ public void testGetBetragMitLeeremVorzeichen() { // Leeres Vorzeichen, aber nicht leerer Betrag -> erlaubt BetragMitVorzeichen kosten = satz.getFeld(Bezeichner.SCHADENBEARBEITUNGSKOSTEN_IN_WAEHRUNGSEINHEITEN, BetragMitVorzeichen.class); assertEquals(BigDecimal.valueOf(12.34), kosten.toBigDecimal()); + // falsches Vorzeichen -> ValidationException + satz.getTeildatensatz(1).setFeld(ByteAdresse.of(167), "x"); + assertThrows(ValidationException.class, () -> satz.getFeld(Bezeichner.SCHADENBEARBEITUNGSKOSTEN_IN_WAEHRUNGSEINHEITEN, BetragMitVorzeichen.class)); } /**