Я пробую свое первое приложение 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? Весной я могу компилировать и использовать его внутри сервисов.