Spring中Page<Entity>.map使用自定义Converter标红报错求助
嘿,这个问题我之前也碰到过!其实核心原因很简单:Spring Data的Page.map()方法需要的是java.util.function.Function<T, R>类型的参数,但你传入的是Spring自带的org.springframework.core.convert.converter.Converter接口实例——这俩虽然都是做对象转换的,但属于不同的函数式接口,编译器没法自动识别,所以才会标红报错。
下面给你几个好用的解决办法,按需选就行:
方法一:用方法引用快速适配Converter到Function
因为Converter的convert方法和Function的apply方法签名完全一致(都是接收一个参数、返回转换后对象),所以直接用方法引用就能把Converter适配成Function:
Page<RoomEntity> roomEntityList = pageableRoomRepository.findAll(pageable); return roomEntityList.map(new RoomEntityToReservationResponseConverter()::convert);
这个方法最简单,不用修改你的Converter类,直接在调用map的时候调整一下就行。
方法二:让转换器类同时实现Function接口
如果你希望Converter本身就能直接被map方法接受,可以修改你的转换器类,同时实现Function接口:
import org.springframework.core.convert.converter.Converter; import java.util.function.Function; public class RoomEntityToReservationResponseConverter implements Converter<RoomEntity, ReservationResponse>, Function<RoomEntity, ReservationResponse> { @Override public ReservationResponse convert(RoomEntity source) { // 这里写你的转换逻辑,比如把RoomEntity的字段映射到ReservationResponse ReservationResponse response = new ReservationResponse(); response.setRoomId(source.getId()); response.setRoomNumber(source.getRoomNumber()); // 其他字段映射... return response; } // 复用convert方法作为Function的apply实现,不用重复写逻辑 @Override public ReservationResponse apply(RoomEntity roomEntity) { return convert(roomEntity); } }
改完之后,你原来的调用代码roomEntityList.map(new RoomEntityToReservationResponseConverter())就能正常工作了。
方法三:直接用Lambda表达式处理转换(适合简单逻辑)
如果你的转换逻辑比较简短,没必要单独写一个Converter类的话,直接在map里用Lambda表达式更省事:
Page<RoomEntity> roomEntityList = pageableRoomRepository.findAll(pageable); return roomEntityList.map(roomEntity -> { ReservationResponse response = new ReservationResponse(); response.setRoomId(roomEntity.getId()); response.setRoomNumber(roomEntity.getRoomNumber()); // 完成其他字段映射 return response; });
方法四:借助Spring的ConversionService(适合已注册的Converter)
如果你的Converter已经注册到Spring的ConversionService中(比如通过@Configuration配置了ConverterRegistry),可以注入ConversionService来完成转换:
import org.springframework.core.convert.ConversionService; import org.springframework.beans.factory.annotation.Autowired; // ... @Autowired private ConversionService conversionService; // 业务方法里 Page<RoomEntity> roomEntityList = pageableRoomRepository.findAll(pageable); return roomEntityList.map(roomEntity -> conversionService.convert(roomEntity, ReservationResponse.class));
最后提醒一下:检查你的Converter导入的包是不是org.springframework.core.convert.converter.Converter,别不小心导错其他包的Converter了哦!
内容的提问来源于stack exchange,提问作者kurt estacion

