实现通用抽象jaxrs服务
问题描述:
我正在努力实现通用抽象jaxrs服务而不重复多个jaxrs注释。实现通用抽象jaxrs服务
因此,举例来说,这里是我的服务和实体的结构:
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();
}
}
的一点是,我对这些CarService
实现的60,我不希望重复getDetails
方法与所有它在每个服务JAXRS的注解,因为它总是相同(相同的样板)。
任何想法或解决方案呢?
答
您可能还想看看更多面向资源的rest库以补充您的JAX-RS代码库。他们可以做到这一点(路径映射,排序,过滤,分页等)没有注释或抽象基类地狱。 crnk.io + jsonapi,graphql,falcor就是这样的库。 (免责声明:我为第一个作出贡献)