使用 JAX-RS 继承

Inheritance with JAX-RS(使用 JAX-RS 继承)
本文介绍了使用 JAX-RS 继承的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我正在为我的网络服务使用 JAX-RS.我有共同的功能,想使用继承.我提供简单的 CRUD 操作.我已经定义了一个这样的接口:

I am using JAX-RS for my web services. I have common functionality and would like to use inheritance. I am providing simple CRUD operations. I have defined an interface like so:

public interface ICRUD {

    @POST
    @Consumes("application/json")
    @Produces("application/json")
    @Path("create")
    public String createREST(String transferObject);

    @GET
    @Consumes("application/json")
    @Produces("application/json")
    @Path("retrieve/{id}")
    public String retrieveREST(@PathParam("id") String id);

    @POST
    @Consumes("application/json")
    @Produces("application/json")
    @Path("update")
    public void updateREST(@Suspended final AsyncResponse asyncResponse,
                           final String transferObject) ;

    @DELETE
    @Consumes("application/json")
    @Produces("application/json")
    @Path("delete/{id}")
    public String deleteREST(@PathParam("id") String id); 
}

我有一个实现这个接口的抽象类:

I have an abstract class that implements this interface:

public abstract class BaseREST implements ICRUD{

private final ExecutorService executorService = Executors.newCachedThreadPool();

@Override
public String createREST(String transferObject) {
    return create(transferObject).toJson();
}

@Override
public String retreiveREST(@PathParam("id") String id) {
    return retreive(id).toJson();
}


@Override
public String deleteREST(
        @PathParam("id") String id) {
    return delete(id).toJson();
}

@Override
    public void updateREST(@Suspended final AsyncResponse asyncResponse, final String transferObject) {
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                asyncResponse.resume(doUpdateREST(transferObject));
            }
        });
    }      

}

最后,我的实现类只是为资源提供了一个 PATH:

And lastly, my implementing class simply provides a PATH for the resource:

@Path("meeting")
public class MeetingRestServices extends BaseREST {
}

当我尝试访问我的资源时(假设上下文根是/):

When I try to access my resource at (assuming the context root is /):

http://localhost:8080/webresources/meeting/retreive/0

我得到一个 404,它说它找不到它.我的想法是,在继承的某个地方,它弄乱了我认为资源应该在哪里的路径.对此有什么想法吗?

I get a 404, it says it can not find it. My thoughts are that somewhere in the inheritance, it is messing with the path of where I think the resource should be. Any thoughts on this?

webresources 定义如下.此类由 Netbeans 自动添加.

webresources is defined below. This class is added automatically by Netbeans.

@javax.ws.rs.ApplicationPath("webresources")
public class ApplicationConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new java.util.HashSet<>();
        addRestResourceClasses(resources);
        return resources;
    }

    /**
     * Do not modify addRestResourceClasses() method.
     * It is automatically populated with
     * all resources defined in the project.
     * If required, comment out calling this method in getClasses().
     */
    private void addRestResourceClasses(Set<Class<?>> resources) {
        resources.add(com.dv.meetmefor.ws.impl.BinaryDataRestService.class);
        resources.add(com.dv.meetmefor.ws.impl.ImageRestServices.class);
        resources.add(com.dv.meetmefor.ws.impl.LocaleRestService.class);
        resources.add(com.dv.meetmefor.ws.impl.MeetUpRestServices.class);
        resources.add(com.dv.meetmefor.ws.impl.MeetingRestServices.class);
        resources.add(com.dv.meetmefor.ws.impl.UserAccountRestServices.class);
    }

}

推荐答案

你上面描述的看起来不错.以下是 JAX-RS 继承规则,这些规则基于您提供的内容.

What you've described above looks good. Here are the rules for JAX-RS inheritance which based on what you've provided you are adhering.

来自 JAX-RS 规范 §3.6:

JAX-RS 注释可以用于超类或已实现的方法和方法参数界面.此类注解由相应的子类或实现类继承方法,前提是该方法及其参数没有任何自己的 JAX-RS 注释.注释超类上的优先级高于已实现接口上的优先级.如果一个子类或实现方法具有任何 JAX-RS 注释,然后是超类或接口方法上的所有注释被忽略.例如:

JAX-RS annotations MAY be used on the methods and method parameters of a super-class or an implemented interface. Such annotations are inherited by a corresponding sub-class or implementation class method provided that method and its parameters do not have any JAX-RS annotations of its own. Annotations on a super-class take precedence over those on an implemented interface. If a subclass or implementation method has any JAX-RS annotations then all of the annotations on the super class or interface method are ignored. E.g.:

public interface ReadOnlyAtomFeed {
    @GET @Produces("application/atom+xml")
    Feed getFeed();
}

@Path("feed")
public class ActivityLog implements ReadOnlyAtomFeed {
    public Feed getFeed() {...}
}

在上面,ActivityLog.getFeed从接口继承了@GET@Produces注解.反之:

In the above, ActivityLog.getFeed inherits the @GET and @Produces annotations from the interface. Conversely:

@Path("feed")
public class ActivityLog implements ReadOnlyAtomFeed {
    @Produces("application/atom+xml")
    public Feed getFeed() {...}
}

在上面,ReadOnlyAtomFeed.getFeed上的@GET注解不是被ActivityLog继承的.getFeed

In the above, the @GET annotation on ReadOnlyAtomFeed.getFeed is not inherited by ActivityLog .getFeed

这篇关于使用 JAX-RS 继承的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How to send data to COM PORT using JAVA?(如何使用 JAVA 向 COM PORT 发送数据?)
How to make a report page direction to change to quot;rtlquot;?(如何使报表页面方向更改为“rtl?)
Use cyrillic .properties file in eclipse project(在 Eclipse 项目中使用西里尔文 .properties 文件)
Is there any way to detect an RTL language in Java?(有没有办法在 Java 中检测 RTL 语言?)
How to load resource bundle messages from DB in Java?(如何在 Java 中从 DB 加载资源包消息?)
How do I change the default locale settings in Java to make them consistent?(如何更改 Java 中的默认语言环境设置以使其保持一致?)