YAMLException: специальные символы не допускаются

Я пытаюсь прочитать файл yml и преобразовать его в объект, чтобы внести изменения в файл yml, но получаю следующее исключение при преобразовании при использовании ISO_8859_1 на сервере Linux.

Исключение:

Caused by: unacceptable code point 'Â' (0x92) special characters are not allowed
in "'reader'", position 950
        at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:211)
        at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:176)
        at org.yaml.snakeyaml.reader.StreamReader.peek(StreamReader.java:136)
        at org.yaml.snakeyaml.scanner.ScannerImpl.scanToNextToken(ScannerImpl.java:1185)
        at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:287)
        at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:227)
        at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingKey.produce(ParserImpl.java:558)
        at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:158)
        at org.yaml.snakeyaml.parser.ParserImpl.getEvent(ParserImpl.java:168)
        at com.fasterxml.jackson.dataformat.yaml.YAMLParser.nextToken(YAMLParser.java:355)
        ... 43 more


com.fasterxml.jackson.dataformat.yaml.snakeyaml.error.YAMLException: special characters are not allowed
 at [Source: (StringReader); line: 165, column: 40]
        at com.fasterxml.jackson.dataformat.yaml.snakeyaml.error.YAMLException.from(YAMLException.java:25)
        at com.fasterxml.jackson.dataformat.yaml.YAMLParser.nextToken(YAMLParser.java:361)
        at com.fasterxml.jackson.core.JsonParser.nextFieldName(JsonParser.java:825)
        at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.mapObject(UntypedObjectDeserializer.java:896)
        at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.deserialize(UntypedObjectDeserializer.java:654)
        at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.mapObject(UntypedObjectDeserializer.java:895)
        at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.deserialize(UntypedObjectDeserializer.java:654)
        at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.mapObject(UntypedObjectDeserializer.java:871)
        at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.deserialize(UntypedObjectDeserializer.java:654)
        at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.mapObject(UntypedObjectDeserializer.java:895)
        at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.deserialize(UntypedObjectDeserializer.java:654)
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4014)
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3005)

Извлечение кода:

StringBuilder contentBuilder = new StringBuilder();
String originalFile = "..path";
try (Stream<String> stream = java.nio.file.Files.lines(Paths.get(originalFile), StandardCharsets.ISO_8859_1)) {
            stream.forEach(s -> contentBuilder.append(s).append("\n"));
        }
        
        Object obj = yamlReader.readValue(contentBuilder.toString(), Object.class); 

Контент Yaml:

---
spring:
  application:
    name: "DGL-SVC-V-AccountRenewalCD"
cdr:
  enable4IPB: true
  mislogging:
    enabled: true
  paymentFrequency:
    cdUpdate:
      monthly: 1
      endOfTerm: 2
    cdDetails:
      monthly: 0
      endOfTerm: 5
  enable4CPB: false
  enableRetirementCDRenewal: true
  interestPaymentApplicationId: "CA"
  interestDistributionMethod:
    payToAffiliate: 1
    redeposit: 0
  addExternalAccounts: false
  invalidIPBTerms: "1,2"
ccp:
  logger:
    ids:
      templateProperties:
        CDRENEWAL: "com.ccp.logging.ids.formatter.JFPIDSMapper||event-type-ccpids-template-self.ftl"
      emsconnector:
        communication: "jms"
      loggerImplementation: "emsConnector"
hystrix:
  threadpool:
    getCDRatesThreadPoolKey:
      maxQueueSize: 5
      coreSize: 40
      maximumSize: 60
      allowMaximumSizeToDivergeFromCoreSize: true
    getCustomerInfoThreadPoolKey:
      maxQueueSize: 5
      coreSize: 40
      maximumSize: 60
      allowMaximumSizeToDivergeFromCoreSize: true
    validateInternalFundTransferThreadPoolKey:
      maxQueueSize: 5
      coreSize: 40
      maximumSize: 60
      allowMaximumSizeToDivergeFromCoreSize: true
    getCDAccountDetailsThreadPoolKey:
      maxQueueSize: 5
      coreSize: 40
      maximumSize: 60
      allowMaximumSizeToDivergeFromCoreSize: true
    submitCDRenewalThreadPoolKey:
      maxQueueSize: 5
      coreSize: 40
      maximumSize: 60
      allowMaximumSizeToDivergeFromCoreSize: true
    submitInternalFundTransferThreadPoolKey:
      maxQueueSize: 5
      coreSize: 40
      maximumSize: 60
      allowMaximumSizeToDivergeFromCoreSize: true
    getRetirementAccountDetailsThreadPoolKey:
      maxQueueSize: 5
      coreSize: 40
      maximumSize: 60
      allowMaximumSizeToDivergeFromCoreSize: true
    getAccountsThreadPoolKey:
      maxQueueSize: 5
      coreSize: 40
      maximumSize: 60
      allowMaximumSizeToDivergeFromCoreSize: true
  command:
    getRetirementAccountDetails:
      execution.isolation.thread.timeoutInMilliseconds: 10000
    submitCDRenewal:
      execution.isolation.thread.timeoutInMilliseconds: 10000
    submitInternalFundTransfer:
      execution.isolation.thread.timeoutInMilliseconds: 10000
    getCustomerInfo:
      execution.isolation.thread.timeoutInMilliseconds: 10000
    validateInternalFundTransfer:
      execution.isolation.thread.timeoutInMilliseconds: 10000
    getAccounts:
      execution.isolation.thread.timeoutInMilliseconds: 10000
    getCDRates:
      execution.isolation.thread.timeoutInMilliseconds: 10000
    getCDAccountDetails:
      execution.isolation.thread.timeoutInMilliseconds: 1
url-info-config:
  urlInfoMap:
    EXTERNAL_ACCOUNT_SERVICE:
      fullUrl: "http://sd-9ea5-6df7.nam.nsroot.net:8142/api/v1/aggregators/customers/{customerId}/accounts"
      serviceName: "B2B-AM-D-YodleeConnector"
      uri: "/api/v1/aggregators/customers/{customerId}/accounts"
      eurekaEnabled: true
    RATES_SERVICE:
      fullUrl: "http://sd-9ea5-6df7.nam.nsroot.net:8142/cdr/bank/rates/retrieve"
      serviceName: "NAM-CARDS-SIM-WRAP-APP-COMMON2"
      uri: "/6916/lisa/bank/rates/retrieve"
      eurekaEnabled: true
    CD_ACCOUNT_DETAILS_SERVICE:
      fullUrl: "http://sd-9ea5-6df7.nam.nsroot.net:8142/v1/domain/accounts/cdAccountDetails/retrieve"
      serviceName: "NAM-CARDS-SIM-WRAP-APP-COMMON2"
      uri: "/6916/lisa/v1/domain/accounts/cdAccountDetails/retrieve"
      eurekaEnabled: true
    ACCOUNT_PROFILE_REFRESH_SERVICE:
      fullUrl: "http://sd-9ea5-6df7.nam.nsroot.net:8142/cdr/private/v2/profiles/accounts/details"
      serviceName: "DGL-AM-V-ACCOUNTPROFILEWS-V2"
      uri: "/private/v1/accounts/profiles/refreshCache"
      eurekaEnabled: true
    ACCOUNT_PROFILE_SERVICE:
      fullUrl: "http://sd-9ea5-6df7.nam.nsroot.net:8142/cdr/private/v2/profiles/accounts/details"
      serviceName: "NAM-CARDS-SIM-WRAP-APP-COMMON2"
      uri: "/6916/lisa/private/v1/accounts/profiles"
      eurekaEnabled: true
    PROJECTED_CD_INFO_SERVICE:
      fullUrl: "http://sd-9ea5-6df7.nam.nsroot.net:8142/v1/domain/accounts/cdAccountProjectedInfo/retrieve"
      serviceName: "NAM-CARDS-SIM-WRAP-APP-COMMON2"
      uri: "/6916/lisa/v1/domain/accounts/cdAccountProjectedInfo/retrieve"
      eurekaEnabled: true
    INTERNAL_FUND_TRANSFER_VALIDATE_SERVICE:
      fullUrl: "http://sd-9ea5-6df7.nam.nsroot.net:8142/cdr/moneymovement/fundstransfer/validate"
      serviceName: "NAM-CARDS-SIM-WRAP-APP-COMMON2"
      uri: "/6916/lisa/moneymovement/fundstransfer/validate"
      eurekaEnabled: true
    SUBMIT_CD_RENEWAL:
      fullUrl: "http://sd-9ea5-6df7.nam.nsroot.net:8142/v1/domain/accounts/updateCDAccount"
      serviceName: "NAM-CARDS-SIM-WRAP-APP-COMMON2"
      uri: "/6916/lisa/v1/domain/accounts/updateCDAccount"
      eurekaEnabled: true
    CUSTOMER_DEMOGRAPHICS_SERVICE:
      fullUrl: "http://sd-9ea5-6df7.nam.nsroot.net:8142/cdr/private/v2/profiles/customers/retrieve"
      serviceName: "NAM-CARDS-SIM-WRAP-APP-COMMON2"
      uri: "/6916/lisa/private/v2/profiles/customers/retrieve"
      eurekaEnabled: true
    INTERNAL_FUND_TRANSFER_SUBMIT_SERVICE:
      fullUrl: "http://sd-9ea5-6df7.nam.nsroot.net:8142/cdr/moneymovement/fundstransfer/submit"
      serviceName: "NAM-CARDS-SIM-WRAP-APP-COMMON2"
      uri: "/6916/lisa/moneymovement/fundstransfer/submit"
      eurekaEnabled: true
    RETIREMENT_ACCOUNT_DETAILS_SERVICE:
      fullUrl: "http://sd-9ea5-6df7.nam.nsroot.net:8142/v1/retirement/accounts/details/retrieve"
      serviceName: "NAM-CARDS-SIM-WRAP-APP-COMMON2"
      uri: "/6916/lisa/api/private/v1/retirement/accounts/details/retrieve"
      eurekaEnabled: true
subApp:
  id: "DGL-SVC-V-AccountRenewalCD"
error-info-config:
  errorInfoMap:
    INTERNAL_SERVER_ERROR:
      httpStatus: 500
      errorCode: "INVALID_REQUEST"
      message: "internal server error"
      type: "ERROR"
    NOT_VALID_CD_ACCOUNT:
      httpStatus: 400
      errorCode: "INVALID_CD_ACCOUNT"
      message: "This is not a valid CD Account for Renewal"
      type: "ERROR"
    ST0064:
      httpStatus: 500
      errorCode: "REC_NOT_FOUND"
      message: "RATE REC NOT FOUND FOR"
      type: "ERROR"
    CD_MINIMUM_BALANCE_ERROR:
      httpStatus: 400
      errorCode: "CD_MINIMUM_BALANCE_ERROR"
      message: "Remaining CD balance cannot subceed the CD Minimum Balance."
      type: "ERROR"
    INSUFFICIENT_BALANCE:
      httpStatus: 500
      errorCode: "INSUFFICIENT_BALANCE"
      message: "Insufficient Balance in the Source Account."
      type: "ERROR"
    SP6032:
      httpStatus: 500
      errorCode: "HOLD_ON_ACCOUNT"
      message: "STOP/HOLD ON ACCOUNT"
      type: "ERROR"
    SP6033:
      httpStatus: 500
      errorCode: "NEW_ACCOUNT"
      message: "THIS IS A NEW ACCOUNT"
      type: "ERROR"
    CLOSE_CD_FLOW:
      httpStatus: 500
      errorCode: "CLOSE_CD_FLOW"
      message: "Partial withdrawal amounts must be less than CD account total."
      type: "ERROR"
    SP6014:
      httpStatus: 400
      contentId: "Landing.renewedCdError"
      errorCode: "CUSTOM_ALERT_ERROR"
      message: "Sorry, we can’t process this request.|Your CD renewal request has\
        \ previously been received and is being processed."
      type: "ERROR"
    VALIDATION_ERROR:
      httpStatus: 400
      errorCode: "INVALID_REQUEST"
      message: null
      type: "ERROR"
    TS9400:
      httpStatus: 400
      errorCode: "ACCOUNT_NOT_FOUND"
      message: "RECORD NOT FOUND"
      type: "ERROR"
    NOT_VALID_APP:
      httpStatus: 400
      errorCode: "CUSTOM_ALERT_ERROR"
      message: "Sorry, we can’t process this request on Mobile app at this time.|Please\
        \ retry on online.com."
      type: "ERROR"
    ST7600:
      httpStatus: 500
      errorCode: "CD_ACCT_NOT_FOR_RECIPIENT"
      message: "CD ACCOUNT NOT VALID FOR RECIPIENT"
      type: "ERROR"
    SP6018:
      httpStatus: 400
      contentId: "Landing.renewedCdError"
      errorCode: "CUSTOM_ALERT_ERROR"
      message: "Sorry, we can’t process this request.|Your CD renewal request has\
        \ previously been received and is being processed."
      type: "ERROR"
    ACCOUNT_ALREADY_UPDATED:
      httpStatus: 400
      contentId: "Landing.renewedCdError"
      errorCode: "CUSTOM_ALERT_ERROR"
      message: "Sorry, we can’t process this request.|Your CD renewal request has\
        \ previously been received and is being processed."
      type: "ERROR"
    ST0204:
      httpStatus: 500
      errorCode: "RENEWAL_BEEN_PROCESSED"
      message: "RENEWAL HAS ALREADY BEEN PROCESSED"
      type: "ERROR"
cdr-product-config:
  cdRenewalRetirementProducts:
  - 262
  - 268
  - 269
  cdRenewalProducts:
  - 184
  - 590
  - 591
tmx:
  applicationName:
    android: 154811
    browser: 144564
    ios: 168524

Добавлено содержимое yaml в соответствии с запросом вместе с деталями исключений и извлечением кода.

Любая помощь приветствуется.


person Parthiban    schedule 26.10.2020    source источник
comment
что в файле yaml?   -  person Shubham Srivastava    schedule 26.10.2020
comment
Добавлен yaml-контент. Это файл конфигурации.   -  person Parthiban    schedule 26.10.2020
comment
Спецификация позволяет файлам YAML быть UTF-8, UTF-16 или UTF-32, и никак иначе. Хотя API Джексона позволяет вам использовать другие кодировки, я рекомендую придерживаться этого ограничения, чтобы избежать подобных ошибок.   -  person flyx    schedule 26.10.2020


Ответы (1)


Как вы можете видеть здесь и здесь, эта кодовая точка соответствует правильному символу кавычек в windows-1252, вероятно, потому что файл был отредактирован в системе Windows.

Как указывает исключение, эта кодовая точка не поддерживается iso-8859-1 или utf-8: см., например, эту страницу для сравнения того, как каждая кодировка поддерживает этот и другие символы.

Чтобы решить вашу проблему, просто отредактируйте файл и сохраните его в кодировке iso-8859-1 или utf-8, заменив этот символ (символы), он должен работать. При просмотре файла YAML очень вероятно, что проблема связана с разными can’t словами в вашей ошибке message.

person jccampanero    schedule 26.10.2020
comment
Благодаря Windows-1252 у меня сработало. Да, я редактировал файл yaml на ПК с Windows раньше. - person Parthiban; 26.10.2020