JavaPOET - только классы имеют суперклассы, а не ИНТЕРФЕЙС

Я пытаюсь сгенерировать код для репозитория JPA ниже, используя библиотеку JavaPOET, но получаю ошибку "только классы имеют суперклассы, а не ИНТЕРФЕЙС".

@Repository 
public interface UserRepository extends PagingAndSortingRepository<User, Long> { 
}

Вот код JavaPOET, который я пробовал.

TypeSpec userRepository = TypeSpec.interfaceBuilder("UserRepository")
                .addAnnotation(Repository.class)
                .addModifiers(Modifier.PUBLIC)
                .superclass(ParameterizedTypeName.get(ClassName.get(PagingAndSortingRepository.class),  
                                                      ClassName.get(User.class),
                                                      ClassName.get(Long.class)))
                .build();

Любое решение/лучшая практика для создания интерфейса, расширяющего класс? Спасибо,


person mrgenco    schedule 15.10.2017    source источник


Ответы (1)


Сообщение довольно ясное:

ошибка "только классы имеют суперклассы, а не ИНТЕРФЕЙС".

TypeSpec.Builder.superclass() действительно позволяет указывать только классы.
Чтобы указать интерфейс, используйте TypeSpec.Builder.addSuperinterface().

Это дало бы:

TypeSpec userRepository = TypeSpec.interfaceBuilder("UserRepository")
                .addAnnotation(Repository.class)
                .addModifiers(Modifier.PUBLIC)
                .addSuperinterface(ParameterizedTypeName.get(ClassName.get(PagingAndSortingRepository.class),  
                                                      ClassName.get(User.class),
                                                      ClassName.get(Long.class)))
                .build();

Он должен сгенерировать этот код:

@org.springframework.data.repository.Repository
public interface UserRepository extends org.springframework.data.repository.PagingAndSortingRepository<User, java.lang.Long> {
}

Вы можете найти полные примеры в модульных тестах проекта JavaPOET.
См. git .

person davidxxx    schedule 15.10.2017
comment
Большое спасибо, это сработало. Не могли бы вы также предложить мне способ компиляции этого сгенерированного кода во время выполнения, чтобы он мог работать без повторного развертывания. Насколько я знаю, у JavaPOET нет такой возможности? Если вы хотите, чтобы я разместил еще один вопрос для этого. Все нормально. - person mrgenco; 15.10.2017
comment
Пожалуйста. Извините, я мало знаю эту библиотеку. Эта проблема может вас заинтересовать: github.com/square/javapoet/pull/396 . - person davidxxx; 15.10.2017