2017-02-14 72 views
0

我正在努力实现通用抽象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的注解,因为它总是相同(相同的样板)。

任何想法或解决方案呢?

回答

0

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