MyBatis не реализует методы по умолчанию родительского интерфейса / базового преобразователя - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь реализовать интерфейс базового преобразователя:

public interface IDAOBase<T, ID> {

    default List<T> findAll() {
        throw new RuntimeException("Method not implemented !");
    }

    default T findById(ID id) {
        throw new RuntimeException("Method not implemented !");
    }

    default ID insert(T t) {
        throw new RuntimeException("Method not implemented !");
    }

    default T update(T t) {
        throw new RuntimeException("Method not implemented !");
    }

    default void delete(ID id) {
        throw new RuntimeException("Method not implemented !");
    }

    default T getRowById(ID id) {
        throw new RuntimeException("Method not implemented !");
    }

}

Это будет преобразователь, расширяющий базовый интерфейс:

@Mapper
interface UserMapper extends IDAOBase<UserVO, Long> {

    UserVO findByUsername(String username);
    // UserVO findById(Long id);
}

Я вызываю преобразователь следующим образом:

@Autowired
private UserMapper mapper;

public UserDetails loadUserById(Long id) {
    return loadUser(mapper.findById(id));
}

Но я получаю исключение RuntimeException из метода по умолчанию:

java.lang.RuntimeException: Method not implemented !
    at com.project.services.IDAOBase.findById(IDAOBase.java:8)

в xml У меня есть метод "findById":

<select id="findById"
        resultType="UserVO">
    <include refid="baseSelect"/>
    where
        k.id = #{id}
</select>

Также;когда я раскомментирую эту строку в интерфейсе mapper, она работает:

Это работает:

@Mapper
interface UserMapper extends IDAOBase<UserVO, Long> {

    UserVO findByUsername(String username);
    UserVO findById(Long id);
}

Это не работает:

@Mapper
interface UserMapper extends IDAOBase<UserVO, Long> {

    UserVO findByUsername(String username);
    // UserVO findById(Long id);
}

В чем здесь ошибка?

1 Ответ

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

В mybatis по умолчанию методы картографов вызываются напрямую, и это особенность. Они не должны отображаться в сопоставлении xml, и идея состоит в том, чтобы повторно использовать некоторые универсальные методы сопоставления в более конкретных методах, которые возвращают те же данные, но в другом формате и т. Д .:

public interface MyMapper {

  List<MyObject> getByIds(List<Long> ids);

  default MyObject getById(Long id) {
    List<MyObject> list = getByIds(Arrays.asList(id));
    // checks
    return list.get(0);
  }


  List<MyObject> getAll();

  default Map<Long, MyObject> getAllAsMap() {
   return getAll().stream().collect(
       Collectors.toMap(MyObject::getId, Functions.identity()));
  }
}

В вашем примере просто удалите реализацию по умолчанию из родительского преобразователя, и она будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...