Как разрешить Либо [Ошибка, Пользователь] в Complete- Akka HTTP - PullRequest
0 голосов
/ 21 октября 2018

Я новичок в Akka HTTP и пытаюсь определить конечную точку ниже.

На уровне маршрутов у меня есть конечная точка:

def login: Route = {
  post(
    entity(as[UserLogin]) { userLogin =>
      complete(
        authService.loginUser(userLogin)
      )
    }
  )
}

подпись authService.loginUser равна

def loginUser(userLogin: UserLogin): Either[Error, UserDto]

Вопрос в том, как я могу решить Either[Error, UserDto]в маршрутах, потому что теперь я получил эту ошибку

Type mismatch, expected: ToResponseMarshallable, actual: Either[Error, UserDto]

UserDto case class

case class UserDto(id: Int,
               username: String,
               email: String,
               firstName: String,
               lastName: String,
               balance: BigDecimal) {
implicit def UserDtoCodecJson: CodecJson[UserDto] =
casecodec6(UserDto.apply, UserDto.unapply)(
  "id", "username", "email",
  "firstName", "lastName", "balance"
)
}

Большое спасибо заранее.

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Если это обычный Scala Either, akka-http равен , обеспечивая неявное преобразование для генерации маршаллера для этого, при условии, что у вас есть маршаллеры для отдельных типов на месте:

implicit def eitherMarshaller[A1, A2, B](implicit m1: Marshaller[A1, B], m2: Marshaller[A2, B]): Marshaller[Either[A1, A2], B]

Вы проверили, что у вас есть маршаллер для Error?

0 голосов
/ 05 ноября 2018

Что я наконец сделал, я реализовал метод, который принимает statusCode и Either[E, R], разрешает Either внутри и вызывает полное значение с требуемыми значениями.

def completeEither[E <: ServiceError, R: ToEntityMarshaller]
(statusCode: StatusCode, either: => Either[E, R])(
  implicit mapper: ErrorMapper[E, HttpError]
): Route = {
  either match {
    case Left(value) => complete(statusCode, ErrorResponse(code = value.code, message = value.message))
    case Right(value) => complete(value)
  }
}
0 голосов
/ 21 октября 2018

Не помещайте ваше неявное определение в ваш тип.Вместо этого создайте один объект и поместите его внутрь:

object serializers {

implicit def UserDtoCodecJson: CodecJson[UserDto] =
  casecodec6(UserDto.apply, UserDto.unapply)(
    "id", "username", "email",
    "firstName", "lastName", "balance"
  )

}

Сделайте то же самое для типа ошибки.Импортируйте объект в область действия маршрута.Я полагаю, что Argonaut может создать тип Either неявным разрешением.

...