Неподдерживаемый тип bean-компонента: UNRESOLVED_TYPE_VARIABLE, K При использовании дженериков - PullRequest
2 голосов
/ 29 мая 2020

Я пробую свое первое приложение Quarkus и перехожу с Spring на Quarkus.

Весной я создал вспомогательную библиотеку, в которой я определил общую c стандартную службу.

Служба класс выглядит так:

public abstract class AbstractService<M extends AbstractModel, K extends Serializable, R extends JpaRepository<M, K>> {

protected R repository;

public AbstractService() {

}

public Optional<M> get(K id) {
    return repository.findById(id);
}

public Optional<M> exists(M model) {
    return repository.findOne(Example.of(model));
}

public List<M> getAll() {
    return repository.findAll();
}

public M addNew(M newModel) {
    return repository.saveAndFlush(newModel);
}

public boolean delete(K id) {
    try {
        repository.deleteById(id);
        return true;
    } catch (Exception ex) {
        return false;
    }
}

public Optional<M> update(M updateModel) {

    Optional<M> mOptional = repository.findById(updateModel.getId());

    if (mOptional.isPresent())
        repository.saveAndFlush(updateModel);

    return mOptional;
}
}

Класс модели выглядит так:

@Getter
@Setter
@MappedSuperclass
@NoArgsConstructor
@AllArgsConstructor
public abstract class AbstractModel {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private K id;
}

Это контроллер:

@Slf4j
@RestController
@RequestMapping("service.api.name")
public abstract class AbstractController<M extends AbstractModel, S extends AbstractService<M, K, R>, K extends Serializable, AMA extends AbstractModelAssembler<M, K>, R extends JpaRepository<M, K>> {

@Value("service.api.name")
protected String apiName;

protected S service;

protected AMA assembler;

public AbstractController() {

}

@GetMapping("/{id}")
@ResponseBody
public Response get(@Context UriInfo uriInfo, @PathVariable(value = "id") K id) {

    Optional<M> optionalModel = service.get(id);

    if (optionalModel.isPresent()) {
        return assembler.singleObject(uriInfo, optionalModel.get(), Response.Status.OK);
    } else {
        return Response.status(Response.Status.NOT_FOUND).build();
    }
}

@GetMapping("/getall")
@ResponseBody
public Response getall(@Context UriInfo uriInfo) {
    return assembler.collection(uriInfo, service.getAll(), Response.Status.OK);
}

@PostMapping("/addNew")
@ResponseBody
public Response addNew(@Context UriInfo uriInfo, @RequestBody M newModel) {

    Optional<M> tmpModel = service.exists(newModel);

    if (tmpModel.isPresent()) {
        return assembler.singleObject(uriInfo, tmpModel.get(), Response.Status.SEE_OTHER);
    } else {
        M model = service.addNew(newModel);
        return assembler.singleObject(uriInfo, model, Response.Status.CREATED);
    }
}

@DeleteMapping("/{id}")
@ResponseBody
public Response delete(@PathVariable(value = "id") K id) {
    if (service.delete(id))
        return Response.noContent().build();
    else
        return Response.status(Response.Status.NOT_FOUND).build();
}

@PutMapping("/update")
@ResponseBody
public Response update(@Context UriInfo uriInfo, @RequestBody M updateModel) {

    Optional<M> mOptional = service.update(updateModel);

    if (mOptional.isPresent()) {
        return assembler.singleObject(uriInfo, mOptional.get(), Response.Status.OK);
    } else {
        return Response.status(Response.Status.NOT_FOUND).build();
    }
}
}

, а это мой Ассемблер:

@Component
public abstract class AbstractModelAssembler<M extends AbstractModel, K extends Serializable> {

@value("service.api.name")
protected String apiName;

public Response singleObject(@context UriInfo uriInfo, M model, Response.Status status) {

List<Link> links = initLinks(model, uriInfo);

GenericEntity<M> genericEntity =
    new GenericEntity<>(model) {
    };

Link self = Link.fromUriBuilder(uriInfo.getAbsolutePathBuilder())
    .rel("self").build();

return Response.status(status).entity(genericEntity).links(self).build();
}

public Response collection(@context UriInfo uriInfo, List models, Response.Status status) {

List<Link> links = new ArrayList<>();
models.forEach(m -> links.addAll(initLinks(m, uriInfo)));

GenericEntity<List<M>> genericEntity =
    new GenericEntity<>(models) {
    };

Link self = Link.fromUriBuilder(uriInfo.getAbsolutePathBuilder())
    .rel("self").build();

return Response.status(status).entity(genericEntity).links(self).build();
}

private List initLinks(M model, UriInfo uriInfo) {
UriBuilder uriBuilder = uriInfo.getRequestUriBuilder();
uriBuilder = uriBuilder.path(model.getId().toString());
Link.Builder linkBuilder = Link.fromUriBuilder(uriBuilder);
Link selfLink = linkBuilder.rel("self").build();//.toString().replace("${application.api.name}", apiName);
return Arrays.asList(selfLink);
//model.setLinks(Arrays.asList(selfLink));
}
}

При попытке собрать собственный исполняемый файл я получаю следующее сообщение:

[INFO] ---------------- -------------------------------------------------- ------ [ИНФОРМАЦИЯ] НЕИСПРАВНОСТЬ [ИНФОРМАЦИЯ] ------------------------------------ ------------------------------------ [ИНФОРМАЦИЯ] Общее время: 9.984 с [ИНФОРМАЦИЯ] Окончание: 2020-05-29T10: 52: 22 + 02: 00 [ИНФОРМАЦИЯ] ---------------------------------- -------------------------------------- [ОШИБКА] Не удалось выполнить цель io.quarkus: quarkus -maven-plugin: 1.5.0.Final: build (по умолчанию) в проекте QuarkusTemplatePlugin: не удалось собрать приложение quarkus: io.quarkus.builder.BuildExcep ция: сбой сборки: сбой сборки из-за ошибок [ERROR] [error]: шаг сборки io.quarkus.ar c .deployment.ArcProcessor # generateResources вызвал исключение: java .lang.IllegalArgumentException: неподдерживаемый тип bean-компонента: UNRESOLVED_TYPLEE_VAR , K [ОШИБКА] в io.quarkus.ar c .processor.Types.getTypeHandle (Типы. java: 141) [ОШИБКА] в io.quarkus.ar c .processor.Types.getTypeHandle (Types. java: 91) [ОШИБКА] в io.quarkus.ar c .processor.Types.getTypeHandle (Типы. java: 77) [ОШИБКА] в io.quarkus.ar c .processor.Types. getTypeHandle (Types. java: 91) [ОШИБКА] в io.quarkus.ar c .processor.BeanGenerator.initConstructor (BeanGenerator. java: 657) [ОШИБКА] в io.quarkus.ar c. processor.BeanGenerator.createConstructor (BeanGenerator. java: 555) [ОШИБКА] в io.quarkus.ar c .processor.BeanGenerator.generateClassBean (BeanGenerator. java: 297) [ОШИБКА] в io.quarkus.ar c .processor.BeanGenerator.generate (BeanGenerator. java: 116) [ОШИБКА] в io.quarkus.ar c .processor.BeanProcessor. generateResources (BeanProcessor. java: 199) [ОШИБКА] в io.quarkus.ar c .deployment.ArcProcessor.generateResources (ArcProcessor. java: 393) [ОШИБКА] в java .base / jdk.internal .reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) [ОШИБКА] в java .base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl. java: 62) [ERROR] в java. internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl. java: 43) [ОШИБКА] в java .base / java .lang.reflect.Method.invoke (Method. java: 566) [ERROR] at io.quarkus.deployment.ExtensionLoader $ 2.execute (ExtensionLoader. java: 932) [ОШИБКА] в io.quarkus.builder.BuildContext.run (BuildContext. java: 277) [ОШИБКА] в org.jboss.threads .ContextClassLoaderSavingRunnable.run (ContextClassLoaderSavingRunnable. java: 35) [ОШИБКА] в org.jboss.threads.EnhancedQueueExecutor.safeRun (EnhancedQueueExecutor.safeRun (EnhancedQueueExecutor. java: 2046) [ERROR.DOOR] at (EnhancedQueueExecutor. java: 1578) [ОШИБКА] в org.jboss.threads.EnhancedQueueExecutor $ ThreadBody.run (EnhancedQueueExecutor. java: 1452) [ОШИБКА] в java .base / java .lang.Thread.run (Thread . java: 834) [ERROR] в org.jboss.threads.JBossThread.run (JBossThread. java: 479) [ERROR] -> [Help 1] [ERROR] [ERROR] Чтобы увидеть полную трассировку стека из-за ошибок повторно запустите Maven с ключом -e. [ОШИБКА] Перезапустите Maven, используя переключатель -X, чтобы включить полное ведение журнала отладки. [ERROR] [ERROR] Для получения дополнительной информации об ошибках и возможных решениях, пожалуйста, прочтите следующие статьи: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Я пропал что-то внутри моего кода или это ограничение Quarkus? Весной я могу компилировать и использовать его внутри сервисов.

1 Ответ

0 голосов
/ 31 мая 2020

Практическое правило при работе в собственном режиме в Quarkus: каждый тип, который должен использовать класс / компонент, должен быть учтен заранее. Тем не менее, в AbstractModel отсутствует объявление типа для K. Это даже не будет компилироваться в режиме JVM, не говоря уже о нативном.

...