从派生的基类返回/中断函数

时间:2014-03-25 14:29:36

标签: scala

在我的REST API服务层中,我有一个ProductService类 我的所有函数中都存在以下逻辑:Do Validate,如果验证失败,我会抛出无效异常,如果通过,我会继续执行下一个try-catch并在发生故障时抛出一般错误:

def addProduct(request:AddProductRequest): BaseResponse[String] = 
{
  try
  {
      request.validate
  }
  catch
  {
     case ex: Exception => {
       Logger.error("Failed to add product, Validation failed", ex);
       val errorResponse:ErrorResponse[String] = new ErrorResponseList().InvalidParameters
       errorResponse.addMessage(ex.getMessage)
       return errorResponse
     }
  }

  try
  {
      val addedProductId = productRepository.addProduct(request.language, request.tenantId, request.product)
      DTOResponse(addedProductId)      
  }
  catch
  {    
     case ex: Exception => {
       Logger.error("Failed to add product to tenant Id="+request.tenantId+" language="+request.language, ex);
       val errorResponse:ErrorResponse[String] = new ErrorResponseList().GeneralError
       errorResponse.addMessage(ex.getMessage())
       return errorResponse
     }
  }
}

现在,我没有使用相同的try和catch为所有函数重复request.validate,而是使用以下函数创建了一个基类:

abstract class ServiceBase {
def validate[T](request:BaseRequest)
{
  try
  {
    request.validate
  }
  catch
  {
    case ex: Exception => {
      Logger.error("Validation failed", ex);
      val errorResponse:ErrorResponse[String] = new ErrorResponseList().InvalidParameters
      errorResponse.addMessage(ex.getMessage)
      return errorResponse
    }
  }
}

现在,我的addProduct(..)将如下所示:

validate(request)
..the rest of the code - the 2nd try-catch

这可以节省很多行。

问题是如果验证失败,它将永远不会返回。我在ServiceBase中收到以下错误:

Multiple markers at this line
- enclosing method validate has result type Unit: return value discarded
- enclosing method validate has result type Unit: return value discarded
- a pure expression does nothing in statement position; you may be omitting necessary 
 parentheses 

2 个答案:

答案 0 :(得分:1)

validate没有返回类型(因此默认返回Unit),ServiceBase validate的签名应如下所示:

def validate[T](request:BaseRequest): BaseResponse[String] =

(假设您要返回BaseResponse[String]

答案 1 :(得分:0)

这可能对某人有用,总有一天,函数编程..我们说^ _ ^

将ServiceBase验证更改为:

def validate[T](request:BaseRequest):Option[BaseResponse[T]] =
{
  try
  {
    request.validate
    None
  }
  catch
  {
    case ex: Exception => {
      Logger.error("Validation failed", ex);
      val errorResponse:ErrorResponse[T] = new ErrorResponseList().InvalidParameters
      errorResponse.addMessage(ex.getMessage)
      return Some(errorResponse)
    }
  }
}

现在我这样做:

def getProducts(request:GetProductsRequest) :BaseResponse[ProductSearchResults] = 
{      
  validate[ProductSearchResults](request).getOrElse(
      {
        try
        {
          val products = productRepository.getProducts(request.language,request.tenantId,request.productIds)
          val foundProducts = for (product <- products) yield  (product.id)
          val notFoundProducts = request.productIds filterNot (foundProducts.toSet)
          val responseWrapper = new ProductSearchResults(products, notFoundProducts)
          DTOResponse(responseWrapper)
        }
        catch
        {
          case ex: Exception => {
            Logger.error("Failed to get products from tenant Id="+request.tenantId+" language="+request.language, ex);
            val errorResponse:ErrorResponse[ProductSearchResults] = new ErrorResponseList().GeneralError
            errorResponse.addMessage(ex.getMessage())
            return errorResponse
            }
        }})
 }