单个ID的Hotel GET接口正常,列表GET接口报AutoMapper映射异常
问题分析:单个Hotel查询正常,列表查询触发AutoMapper映射异常
开发的HTTPS GET接口中,根据ID查询单个Hotel的方法运行正常,但返回Hotel列表的方法抛出AutoMapper映射异常。
控制器代码
// GET: api/Hotels [HttpGet] public async Task<ActionResult<IEnumerable<HotelDto>>> GetHotels() { var hotels = _hotelsRepository.GetAllAsync(); return Ok(_mapper.Map<List<HotelDto>>(hotels)); } // GET: api/Hotels/5 [HttpGet("{id}")] public async Task<ActionResult<HotelDto>> GetHotel(int id) { var hotel = await _hotelsRepository.GetAsync(id); if (hotel == null) { return NotFound(); } return Ok(_mapper.Map<HotelDto>(hotel)); }
AutoMapper配置
public MapperConfig() { CreateMap<Country, CreateCountryDto>().ReverseMap(); CreateMap<Country, GetCountriesDto>().ReverseMap(); CreateMap<Country, GetCountryDto>().ReverseMap(); CreateMap<Country, UpdateCountryDto>().ReverseMap(); CreateMap<Hotel, HotelDto>().ReverseMap(); CreateMap<Hotel, CreateHotelDto>().ReverseMap(); }
错误响应详情
AutoMapper.AutoMapperMappingException: Missing type map configuration or unsupported mapping. Mapping types: AsyncStateMachineBox`1 -> List`1 System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.Collections.Generic.List`1[[HotelListing.API.Data.Hotel, HotelListing.API, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[HotelListing.API.Repository.GenericRepository`1+<GetAllAsync>d__4[[HotelListing.API.Data.Hotel, HotelListing.API, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], HotelListing.API, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> System.Collections.Generic.List`1[[HotelListing.API.Models.Hotels.HotelDto, HotelListing.API, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
问题原因
GetHotels方法中调用_hotelsRepository.GetAllAsync()时未添加await关键字,导致hotels变量的实际类型是Task<List<Hotel>>,而非预期的List<Hotel>。AutoMapper没有配置从Task<T>到List<HotelDto>的映射规则,因此触发映射异常。
而单个查询的GetHotel方法正确使用await获取到了实际的Hotel对象,所以能正常完成映射。
解决方案
在GetHotels方法中为GetAllAsync()添加await,获取到实际的酒店列表后再执行映射:
// GET: api/Hotels [HttpGet] public async Task<ActionResult<IEnumerable<HotelDto>>> GetHotels() { var hotels = await _hotelsRepository.GetAllAsync(); return Ok(_mapper.Map<List<HotelDto>>(hotels)); }
内容的提问来源于stack exchange,提问作者untitiledunmastered
相关产品推荐
相关产品推荐

