我正在尝试我的第一个Quarkus应用程序,并且正在从Spring转移到Quarkus。
在Spring中,我创建了一个helper库,其中定义了一个通用的StandardService。
服务类如下所示:
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;
}
}
model类如下所示:
@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));
}
}
是我的代码中遗漏了什么,还是Quarkus的限制?在Spring中,我可以在服务内部编译和使用它。
在Quarkus中使用纯模式时的经验法则:必须预先考虑类/bean需要使用的每个类型。也就是说,abstractModel
缺少k
的类型声明。这甚至不能在JVM模式下编译,更不用说原生了。
问题内容: 为什么Java中的泛型只能用于类,而不能用于原始类型? 例如,这可以正常工作: 但这是不允许的: 问题答案: ava中的泛型是一个完全编译时的结构-编译器将所有泛型使用转换为正确的类型。这是为了保持与以前的JVM运行时的向后兼容性。 这个: 变成(大致): 因此,任何用作泛型的东西都必须可转换为Object(在此示例中返回),而原始类型则不是。因此它们不能用于泛型。
为什么Java中的泛型可以处理类而不能处理基元类型? 例如,这个操作很好: 但这是不允许的:
下面是错误指定的错误示例。我应该如何修复它,为什么我得到一个错误?
我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类
我想使用泛型类作为另一个泛型类的类型参数。 起初,我对类的定义是这样的: 然后我的需求发生了变化,我不得不为我的R类型使用包装器/持有者类 到目前为止,我的尝试:(给出编译时错误:
但是当我尝试时,我会遇到以下异常。 我应该如何在Spring中Autowire泛型类型?