gpt4 book ai didi

java - 为什么应该为 JAX-RS 实现声明一个接口(interface)?

转载 作者:行者123 更新时间:2023-12-01 20:26:23 25 4
gpt4 key购买 nike

我已经阅读了几个教程,在其中我可以看到创建了 JAX-RS 注释的接口(interface)。后来完成了相同的实现。

为什么会这样呢?我不能直接将具体类公开为 RESTful 服务吗?这是一个不好的做法吗?以下是我在 this 中遇到的示例之一问题。

public interface ICRUD {

@POST
@Consumes("application/json")
@Produces("application/json")
@Path("create")
public String createREST(String transferObject);

@GET
@Consumes("application/json")
@Produces("application/json")
@Path("retreive/{id}")
public String retreiveREST(@PathParam("id") String id);

@POST
@Consumes("application/json")
@Produces("application/json")
@Path("update")
public void updateREST(@Suspended final AsyncResponse asyncResponse,
final String transferObject) ;

@DELETE
@Consumes("application/json")
@Produces("application/json")
@Path("delete/{id}")
public String deleteREST(@PathParam("id") String id);
}

最佳答案

Can't I expose a concrete class directly as a RESTful Service?

你绝对可以。你尝试过吗?它应该工作得很好。

Is that a bad practice?

就我个人而言(这只是我的偏好),我认为使用接口(interface)是不好的做法。有些人可能会说它清理了你的代码,但是使用接口(interface)会带来一些问题,例如 annotation inheritance有时会给那些不明白问题所在的人带来问题。它真的很难发现。

如果你的论点是接口(interface)使代码更简洁,我有几个论点。

(1) 您的代码不太容易理解。您需要不断引用接口(interface)以查看参数的用途(例如检查方法参数注释)。当所有注释都在您实际编写的代码中时,这会更容易。

(2) 接口(interface)没有实现,因此您仍然需要实现每个类。我个人选择一个抽象基类来实现所有基本操作。例如

public abstract class AbstractResource<T extends BaseEntity> {

private final Repository<T> repository;

public AbstractResource(Repository<T> repository) {
this.repository = repository;
}

@GET
public List<T> getAll() {
return this.repository.findAll();
}

@GET
@Path("{id}")
public T getOne(@PathParam("id") long id) {
T result = this.repository.findOne(id);
if (result == null) {
throw new NotFoundException();
}
return result;
}

@POST
public Response create(T entity, @Context UriInfo uriInfo) {
T saved = this.repository.save(entity);
// BaseEntity should have an id property
long id = saved.getId();
URI createdUri = uriInfo.getAbsoluteUriBuilder()
.path(id).build();
return Response.created(createdUri).build();
}
}

您可以对 @PUT@DELET 执行相同的操作。所有资源集合的核心功能都是相同的。唯一需要更改的是 Repository 类型。您的所有实现都可以像这样扩展它

@Path("pets")
public class PetsResource extends AbstractResource<Pet> {

@Inject
public PetsResource(PetsRepository repository) {
super(repository);
}
}

这样就干净多了。您不需要为具体资源实现相同的基本 CRUD 操作。如果您想在具体资源类中提供其他资源方法,您可以这样做。

关于java - 为什么应该为 JAX-RS 实现声明一个接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43845178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com