我正在努力实现通用抽象jaxrs服务,而又不重复几个jaxrs批注。

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

抽象实体

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();
    }
}


实现就像:

汽车.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
}


现在,我想将汽车实体发布到/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实现,并且我不想在每个服务中都重复使用jaxrs注释的getDetails方法,因为它总是相同的(相同的样板)。

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

最佳答案

潜在地,您可能还希望查看更多面向资源的rest库,以补充您的JAX-RS代码库。他们可以完全做到这一点(路径映射,排序,过滤,分页等),而无需注释或抽象基类。 crnk.io + jsonapi,graphql,falcor是此类库。 (免责声明:我为第一个做贡献)

关于java - 实现通用抽象jaxrs服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42233456/

10-11 12:57
查看更多