当前位置: 首页 > 知识库问答 >
问题:

不支持的bean类型:UNRESOLVED_TYPE_VARIABLE,使用泛型时为K

寇景明
2023-03-14

我正在尝试我的第一个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中,我可以在服务内部编译和使用它。

共有1个答案

端木皓君
2023-03-14

在Quarkus中使用纯模式时的经验法则:必须预先考虑类/bean需要使用的每个类型。也就是说,abstractModel缺少k的类型声明。这甚至不能在JVM模式下编译,更不用说原生了。

 类似资料:
  • 问题内容: 为什么Java中的泛型只能用于类,而不能用于原始类型? 例如,这可以正常工作: 但这是不允许的: 问题答案: ava中的泛型是一个完全编译时的结构-编译器将所有泛型使用转换为正确的类型。这是为了保持与以前的JVM运行时的向后兼容性。 这个: 变成(大致): 因此,任何用作泛型的东西都必须可转换为Object(在此示例中返回),而原始类型则不是。因此它们不能用于泛型。

  • 为什么Java中的泛型可以处理类而不能处理基元类型? 例如,这个操作很好: 但这是不允许的:

  • 下面是错误指定的错误示例。我应该如何修复它,为什么我得到一个错误?

  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 我想使用泛型类作为另一个泛型类的类型参数。 起初,我对类的定义是这样的: 然后我的需求发生了变化,我不得不为我的R类型使用包装器/持有者类 到目前为止,我的尝试:(给出编译时错误:

  • 但是当我尝试时,我会遇到以下异常。 我应该如何在Spring中Autowire泛型类型?