实现通用抽象jaxrs服务



我很难在不复制几个jaxr注释的情况下实现通用抽象jaxr服务。

例如,这里是我的服务和实体结构:

AbstractEntity.java

import javax.xml.bind.annotation.XmlElement;
public abstract class AbstractEntity {
@XmlElement
private String name;
public String getName() {
return name;
}
}

AbstractService.java

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
public class AbstractService<T extends AbstractEntity> {
@POST
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.TEXT_PLAIN)
@Path("/details")
public Response getEntityDetails(final T entity) {
// just return the name of this entity
return Response.ok(entity.getName()).build();
}
}

实现方式如下:

Car.java

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Car extends AbstractEntity {
@XmlElement
private String brand;
public String getBrand() {
return brand;
}
}

CarService.java

import javax.ws.rs.Path;
@Path("/cars")
public class CarService extends AbstractService<Car> {
// should provide the super getEntityDetails method with a Car entity
}

现在我想将我的汽车实体POST到/cars/details以获得详细信息(返回在抽象服务中实现的名称"A5"):

POST /cars/details
<car>
<brand>Audi</brand>
<name>A5</name>
</car>

不幸的是,当我把它发布到我的服务时,它说:

JAXRSUtils    W   .No message body reader found for request class : AbstractEntity, ContentType : application/xml.
WebApplicatio W   WebApplicationException has been caught : no cause is available

如果我按照以下方式实现CarService,我可以纠正它:

CarService.java

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Path("/cars")
public class CarService extends AbstractService<Car> {
@POST
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.TEXT_PLAIN)
@Path("/details")
@Override
public Response getEntityDetails(final Car entity) {
return super.getEntityDetails(entity);
}
}

并从抽象服务中删除所有jaxrs注释:

AbstractService.java

import javax.ws.rs.core.Response;
public class AbstractService<T extends AbstractEntity> {
public Response getEntityDetails(final T entity) {
// just return the name of this entity
return Response.ok(entity.getName()).build();
}
}

重点是,我有大约60个这样的CarService实现,我不想在每个服务中重复getDetails方法及其所有jaxrs注释,因为它总是相同的(相同的样板文件)。

有什么想法或解决方案吗?

您可能还想了解更多面向资源的rest库,以补充您的JAX-RS代码库。它们可以做到这一点(路径映射、排序、过滤、分页等),而无需注释或抽象基类hell。crnk.io+jsonapi、graphql、falcor就是这样的库。(免责声明:我为第一个贡献)

最新更新