java - 实现通用抽象 jaxrs 服务

标签 java web-services generics jax-rs

我正在努力实现一个通用的抽象 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
}

现在我想将我的汽车实体发布到 /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 注释,因为它始终是相同的(相同的样板)。

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

最佳答案

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

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

相关文章:

java - 更改 JTextArea 中的位置标记颜色

java - 在 log4j 中配置 SMTPAppender 的正确方法是什么?

javascript - JQuery 调用 XML Web 服务

java - Android 泛型错误 : The method is not applicable for the arguments

java - 环境变量在 Elastic Beanstalk Procfile 中不可用

java - 实现 RichTextFX GenericStyledArea

c# - 通用函数无法比较数组值和标准值

c# - 使用最小起订量设置通用方法,其中类型直到运行时才知道?

sql - Web 服务的正确日期时间格式

java - maven-jaxb2-plugin 有什么用?