2016-05-13 13 views
0

這裏是我的日益增長validationRejectionHandler我噴的項目:噴射排斥處理瘋狂......還是我?

implicit def validationRejectionHandler = RejectionHandler { 
    case ValidationRejection(errMsg,_) :: _ => 
     logger.info(s"received validation error: $errMsg") 
     complete(StatusCodes.Unauthorized,errMsg) 
    case MalformedQueryParamRejection(parameterName, errorMsg, cause) :: _ => 
     logger.debug(s"received MalformedQueryParamRejection error: $errorMsg") 
     complete(BadRequest -> GenericMessageObj(s"The query parameter $parameterName was malformed: $errorMsg")) 
    case spray.routing.AuthorizationFailedRejection :: _ => 
     //todo - this string shouldn't be here 
     logger.info("received authentication error") 
     complete(StatusCodes.Unauthorized, "User is not authorized to this resource") 
    case MalformedRequestContentRejection(msg, causeOpt) :: _ => 
     complete { 
     causeOpt.map { cause => 
      cause match { 
      case e: InvalidFormatException => 
       val fieldNameMatcher = """\["(.+)"\]""".r.unanchored 
       val fieldTypeMatcher = """(\w+)$""".r.unanchored 
       e.getPath.toString match { 
       case fieldNameMatcher(fieldName) => 
        e.getTargetType.toString match { 
        case fieldTypeMatcher(fieldType) => 
         val fieldTypeLowerCase = fieldType.toLowerCase() 
         BadRequest -> GenericMessageObj(s"""Invalid data: "${fieldName}" must be a ${fieldTypeLowerCase} value, but received ${e.getValue}""") 
        case _ => 
         BadRequest -> GenericMessageObj(s"""${e.getValue} is an improper type for field "${fieldName}""") 
        } 
       case _ => 
        logger.debug(s"Failed pattern match: ${e.getPath.toString}") 
        BadRequest -> GenericMessageObj("Invalid payload format") 
      } 

      case e: UnrecognizedPropertyException => BadRequest -> GenericMessageObj(s"Unrecognized property: ${e.getPropertyName}") 

      case e: JsonMappingException => 
       if(cause.getCause == null || cause.getCause.getMessage == null){ 
       val deserializationMsgMatcher = """Can not deserialize instance of scala\.collection\.(Seq) out of (VALUE_NUMBER_INT) [\s\S]+"(name)":[+-]?\d\};[\s\S]+\["(\3)"\].+""".r.unanchored 
       cause.getMessage match { 
        case deserializationMsgMatcher(expected, actual, fieldName, _) => 
        logger.debug(s"Desrializaiton error at $fieldName: Found $actual instead of $expected") 
        BadRequest -> GenericMessageObj(s"Invalid format for $fieldName") 
        case _ => 
        BadRequest -> GenericMessageObj(s"${cause.getMessage}") 
        } 
       } else if (!cause.getCause.getMessage.isEmpty) { 
       BadRequest -> GenericMessageObj(cause.getCause.getMessage) 
       } else { 
       BadRequest -> GenericMessageObj(s"Invalid data format") 
       } 
      case _ => BadRequest -> GenericMessageObj(s"An unknown error occurred.") 
      } 
     } 
     } 
    case spray.routing.MissingHeaderRejection(headerName) :: _ => 
     complete(BadRequest -> GenericMessageObj("%s header is missing.".format(headerName))) 
    } 
} 

這太瘋狂了,我認爲這個代碼令人費解位 - 完整的正則表達式來破譯不同類型的錯誤 - 是處理拒絕的方式噴射,以便它不會向API客戶端返回類似這樣的醜陋消息:

{ 「message」:「缺少必需的創建者屬性'值'(索引2)\ n在[Source:{\ n \ source \「:\」k \「,\ n \」values \「:[\ n {\ n \」dt \「:\」2015-10-15T16:27:42.014Z \「,\ n \」id \「:\」0022A3000004E6E1 \「,\ n \ n \」屬性\「:\」a \「,\ n \」_ id \「:\」45809haoua \「,\ n \」__ id \「:\」 a2p49t7ya4wop9h \「,\ n \」___ id \「:\」q2ph84yhtq4pthqg \「\ n}] \ n}; line:12,column:9](through reference chain:io.keenhome.device.models.DatumList [\「values \」] - > com.fasterxml.jackson.module.scala.deser.BuilderWrapper [0])「 }

我該如何處理這些錯誤信息(例如,返回非垃圾API客戶端),而不必做有可能改變串的正則表達式?

+0

你的問題太籠統了。上面寫代碼的人是你嗎?如果是的話,你可以用更簡單的方式重寫它。否則,我建議詢問更具體的問題。 – expert

+0

更新後問一個更具體的問題 – threejeez

回答

0

啊我看到這些瘋狂的消息是由產生。Jackson(未噴霧),所以,你有幾個選擇:

1)handleExceptions指令處理JSONObjectException

2)或者在到達路由之前捕獲並將JSONObjectException轉換爲異常類。然後我會處理自定義異常處理程序的響應。

​​

和拒絕我使用轉換默認文本阿卡-HTTP拒絕以JSON響應該API客戶期望(我可以告訴它,如果你喜歡)定製的拒絕處理。