Мой batis — не найден обработчик типов для сопоставления свойств с коллекцией

#java #spring-boot #mybatis

#java #весенняя загрузка #mybatis

Вопрос:

Я пытаюсь извлечь данные с помощью mybatis с помощью spring boot. Я создал интерфейс mapper, а также XML-файл с resultMap и запросом, но я получаю сообщение об ошибке:

java.lang.Исключение IllegalStateException: обработчик типов не найден для свойства PatientID

Что может быть не так с моим решением?

Целевой объект:

 @NoArgsConstructor
@AllArgsConstructor
@Data
public class PatientBandDailySynchronizationStatisticsDTO {

    private UUID patientId;
    private String firstName;
    private String lastName;
    private List<BandDailySynchronizationStatisticsDTO> bandDailySynchronizationStatistics;
}
  

Целевой внутренний объект:

 @NoArgsConstructor
@AllArgsConstructor
@Data
public class BandDailySynchronizationStatisticsDTO {

    private LocalDate date;
    private long gsrCount;
    private long ibiCount;
    private long temperatureCount;
    private LocalDate synchronizationDate;
}
  

Интерфейс Mapper:

 @Mapper
public interface PatientBandDailySynchronizationStatisticsMapper {

    List<PatientBandDailySynchronizationStatisticsDTO> queryAll(@Param("patientIds")List<UUID> patientIds,
                                                                @Param("startDate") LocalDate startDate,
                                                                @Param("endDate") LocalDate endDate);

}
  

xml-файл:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.e1s.bambino.band.statistics.synchronization.mapper.PatientBandDailySynchronizationStatisticsMapper">

    <resultMap type="com.e1s.bambino.band.statistics.synchronization.PatientBandDailySynchronizationStatisticsDTO"
               id="patientStatisticsMap">
        <result property="patientId" column="id"/>
        <result property="firstName" column="first_name"/>
        <result property="lastName" column="last_name"/>
        <collection property="bandDailySynchronizationStatistics"
                    ofType="com.e1s.bambino.band.statistics.synchronization.BandDailySynchronizationStatisticsDTO"
                    javaType="List"
                    resultMap="statisticsMap">
        </collection>
    </resultMap>

    <resultMap type="com.e1s.bambino.band.statistics.synchronization.BandDailySynchronizationStatisticsDTO"
               id="statisticsMap">
        <result property="date" column="date"/>
        <result property="gsrCount" column="gsr_count"/>
        <result property="ibiCount" column="ibi_count"/>
        <result property="temperatureCount" column="temperature_count"/>
        <result property="synchronizationDate" column="synchronization_date"/>
    </resultMap>

    <select id="queryAll" resultMap="patientStatisticsMap">
        SELECT p.id, p.first_name, p.last_name FROM patient p
        LEFT OUTER JOIN band_daily_synchronization_statistics bs
        ON bs.patient_id = p.id
        WHERE p.id IN #{patientIds}
        AND (bs.id IS NULL OR bs.date BETWEEN #{startDate} AND #{endDate})
    </select>
</mapper>
  

Я вставил интерфейс mapper в

 src/main/java/com/e1s/bambino/band/statistics/synchronization/BandDailySynchronizationStatisticsMapper.java
  

Соответствующий xml находится в:

 src/main/resources/com/e1s/bambino/band/statistics/synchronization/PatientBandDailySynchronizationStatisticsMapper.xml
  

Я внедрил mapper в свой сервис через конструктор.

 @Service
@RequiredArgsConstructor
public class BandDailySynchronizationStatisticsService {

    private final PatientBandDailySynchronizationStatisticsMapper mapper;
    
    public List<PatientBandDailySynchronizationStatisticsDTO> searchBandDailySynchronizationStatistics(BandDailySynchronizationStatisticsSearchCriteria searchCriteria) {
        List<PatientBandDailySynchronizationStatisticsDTO> allForPatients = mapper.queryAll(searchCriteria.getPatientIds(), searchCriteria.getStartDate(),
                searchCriteria.getEndDate());
        return allForPatients;
    }
  

Исключение:

     Caused by: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'com/e1s/bambino/band/statistics/synchronization/PatientBandDailySynchronizationStatisticsMapper.xml'. Cause: java.lang.IllegalStateException: No typehandler found for property patientId
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:123)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.parse(XMLMapperBuilder.java:95)
    at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.loadXmlResource(MapperAnnotationBuilder.java:179)
    at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parse(MapperAnnotationBuilder.java:118)
    at org.apache.ibatis.binding.MapperRegistry.addMapper(MapperRegistry.java:72)
    at org.apache.ibatis.session.Configuration.addMapper(Configuration.java:819)
    at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:80)
    ... 75 more
Caused by: java.lang.IllegalStateException: No typehandler found for property patientId
    at org.apache.ibatis.mapping.ResultMapping$Builder.validate(ResultMapping.java:151)
    at org.apache.ibatis.mapping.ResultMapping$Builder.build(ResultMapping.java:140)
    at org.apache.ibatis.builder.MapperBuilderAssistant.buildResultMapping(MapperBuilderAssistant.java:446)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildResultMappingFromContext(XMLMapperBuilder.java:393)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:280)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:254)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElements(XMLMapperBuilder.java:246)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:119)
    ... 81 more
  

Заранее спасибо за все ответы.

Комментарии:

1. Файл XML должен находиться в src/main/resources/com/e1s/bambino/band/statistics/synchronization/mapper каталоге. В противном случае инструмент сборки (т.Е. maven или gradle) не копирует XML-файл в целевой каталог при сборке проекта.

2. Спасибо, похоже, я все еще что-то упускаю. Однако журналы в трассировке stact теперь без журналов org.springframework

3. Вы должны отредактировать вопрос и обновить трассировку стека (и заголовок, если необходимо).

4. namespace Указанный в XML содержит ‘mapper’ в имени пакета. Попробуйте удалить его.

5. Спасибо, xml теперь в действии, однако у меня возникли некоторые проблемы с его анализом. Я изменил тему и описание вопроса, и завтра попытаюсь решить эту проблему с помощью обработчика типов