我刚刚熟悉使用JAX-RS在Java中实现REST Web服务,我遇到了以下问题.我的一个资源类需要访问存储后端,该后端在StorageEngine接口后面被抽象出来.我想将当前StorageEngine实例注入服务于REST请求的资源类中,我认为这样做的好方法是使用@Context注释和适当的ContextResolver类.这是我到目前为止:
在MyResource.java:
class MyResource {
    @Context StorageEngine storage;
    [...]
}
在StorageEngineProvider.java:
@Provider
class StorageEngineProvider implements ContextResolver<StorageEngine> {
    private StorageEngine storage = new InMemoryStorageEngine();
    public StorageEngine getContext(Class<?> type) {
        if (type.equals(StorageEngine.class))
            return storage;
        return null;
    }
}
我正在使用com.sun.jersey.api.core.PackagesResourceConfig自动发现提供程序和资源类,并根据日志,它StorageEngineProvider很好地获取类(时间戳和故意遗漏的不必要的东西):
INFO: Root resource classes found:
    class MyResource
INFO: Provider classes found:
    class StorageEngineProvider
但是,storage我的资源类中的值总是如此null- Jersey的调用器StorageEngineProvider及其getContext方法都不会被调用.我在这做错了什么?
我正在基于一个示例编写一个托管在Heroku上的Java RESTful服务 - > https://api.heroku.com/myapps/template-java-jaxrs/clone
我的样品服务是:
package com.example.services;
import com.example.models.Time;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/time")
@Produces(MediaType.APPLICATION_JSON)
public class TimeService {
    @GET
    public Time get() {
        return new Time();
    }
}
我的主要是:
public class Main {
    public static final String BASE_URI = getBaseURI();
    /**
     * @param args
     */
    public static void main(String[] args) throws Exception{
        final Map<String, String> initParams = new HashMap<String, String>();
        initParams.put("com.sun.jersey.config.property.packages","services.contracts"); 
        System.out.println("Starting grizzly...");
        SelectorThread threadSelector = GrizzlyWebContainerFactory.create(BASE_URI, initParams);
        System.out.println(String.format("Jersey started with WADL available at …我正在为我的项目使用jersey,并从字符串中解析URI.
UriBuilder.fromUri("http://localhost:8000").build();
代码很简单,但我在下面收到错误
java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl
似乎程序找不到代理人.我已导入javax.ws.rs.core.UriBuilder并且jersey-common 2.0应该在我的构建路径中包含委托.但我仍然得到这个错误.
有人知道如何解决它吗?谢谢!
我有大约7个REST Web服务要实现.其中一些Web服务具有标准(相同)响应,而一些响应不同.
对这些Web服务的请求是不同的,但是一些请求和一些响应具有相同的底层数据对象.
我不确定是否必须为每个Web服务构建单独的请求/响应类或重用标准服务.我想知道是否有一个设计模式来为这些Web服务建模请求对象和响应对象.
好吧,说帐户和书籍是我的网络服务将要处理的两个休息资源.
class Account {
    String username;
    String id;
}
class Book {
    String title;
    String isbn;
}
所以我的网络服务看起来像这样:
MYAPI/CreateAccountandBook
MYAPI/Account/Create
MYAPI/Book/Create
MYAPI/Book/Update/{isbn}
MYAPI/Account/Update/{id}
MYAPI/Account/getInfo/{id} 
等等.
现在CreateAccountandBook请求将获取有效负载中的帐户对象和书籍列表.此外,响应对象MYAPI/Account/getInfo/{id}还有一个帐户对象和与该帐户关联的书籍列表.但响应对象还包括一个statusCode和Description.
现在我想以最好的方式为这些请求和响应对象创建类.
好的开始.
我有两个抽象类StandardRequest和StandardResponse.
所有请求类都将扩展标准请求类并相应地进行自定义.所有响应类都将扩展标准响应类并相应地进行自定义.
但是这些请求和响应可能彼此不同,但仍然重用相同的实体对象.
例如:
createAccountandBook 请求对象如下所示:  
class CreateAccountAndBookRequest {
   Account account;
   List<Book> books;
}
而对getInfoWeb服务的响应是:  
class GetInfoResponse {
   Account account;
   List<Book> books;
   String statusCode;
   String description;
}
所以请求和响应类之间存在重叠.我可以为每个Web服务创建两个(req/res)类.但是想知道是否有更好的方法来模拟这些类.
我有一个使用Jersey实现的JAX-RS REST服务.JAX-RS/Jersey的一个很酷的功能就是如何轻松地将POJO变成REST服务,只需简单地添加一些Java注释......包括一个简单的机制,用于将POJO转换为JSON - 使用JAXB注释.
现在,我希望能够利用这种非常酷的JSON-ifying功能用于非REST目的 - 我希望能够将这些对象中的一些序列化为磁盘,作为JSON文本.这是我想要序列化的示例JAXB对象:
@XmlRootElement(name = "user")
public class UserInfoImpl implements UserInfo {
    public UserInfoImpl() {} 
    public UserInfoImpl(String user, String details) {
        this.user = user;
        this.details = details;
    }
    public String getUser() { return user; }
    public void setUser(String user) { this.user = user; }
    public String getDetails() { return details; }
    public void setDetails(String details) { this.details = details; }
    private String user;
    private String details;
}
泽西可以将其中一个变成json而没有额外的信息.我想知道泽西是否已经在API中公开了这个功能,以满足我的需求?到目前为止我找不到运气了......
谢谢!
更新2009-07-09:我已经了解到我可以使用Providers对象几乎完全按照我的意愿行事:
  @Context Providers ps; …我是RESTful webservices的新手,并试图@OneToMany从独立的客户端应用程序更新我的关系,但我无法做到这一点.我正在使用Glassfish 3.1.1附带的JAX-RS的Jersey实现.
我有一个与班级A有@OneToMany关系的班级B.
MyRestClient 是我的独立客户端,它调用我在Glassfish 3.1.1上部署的RESTful Web服务.
MyRestClient.java
public class MyRestClient {
    public static void main(String[] args) {    
        Client client = Client.create();        
        WebResource resource = client.resource("http://localhost:8080/myapp/rest/a/update/123");    
        B b1 = new B("debris");     
        ClientResponse response = resource.put(ClientResponse.class, b1);
        System.out.println(response.getEntity(A.class).getTitle() + " has " + response.getEntity(A.class).getBList().size() + " Bs.");
    }
}
AResource 是一个EJB会话bean,我将其用作RESTful Web服务.
AResource.java
@Stateless
@Path("/a")
public class AResource {
    @EJB
    private AManager aManager;
    @PUT
    @Consumes(MediaType.APPLICATION_XML)
    @Produces(MediaType.APPLICATION_XML)
    @Path("/update/{id}")
    public Response updateA(B b, @PathParam("id") …我有一个消耗和生成JSON对象的RESTful服务,我希望Jersey使用Gson而不是Jackson.
如何才能做到这一点...?
在访问我的jax-rs资源时,我收到了以下堆栈跟踪.
我正在使用Tomcat 7,Jersey 1.12和Hibernate 4以及MySQL.
我在搜索解决方案时找到了本教程:http://aruld.info/handling-generified-collections-in-jersey-jax-rs/但是列出的所有示例似乎都不起作用.
我在这里错过了什么?
请不要让我写的答案MessageBodyWriters,这应该可以解决问题.(而且我知道有一个解决方案,我无法弄明白.)
这是我的所有罐子:
antlr-2.7.7.jar
asm-3.1.jar
commons-collections-3.2.1.jar
dom4j-1.6.1.jar
gson-1.7.1.jar
hibernate-commons-annotations-4.0.1.Final.jar
hibernate-core-4.1.0.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
jackson-core-asl-1.9.2.jar
jackson-jaxrs-1.9.2.jar
jackson-mapper-asl-1.9.2.jar
jackson-xc-1.9.2.jar
javassist-3.15.0-GA.jar
jboss-logging-3.1.0.CR2.jar
jboss-transaction-api_1.1_spec-1.0.0.Final.jar
jersey-client-1.12.jar
jersey-core-1.12.jar
jersey-json-1.12.jar
jersey-server-1.12.jar
jersey-servlet-1.12.jar
jettison-1.1.jar
jsr311-api-1.1.1.jar
mysql-connector-java-3.1.12-bin.jar
这是我的资源类和方法:
@Path("/region")
public class RegionService {
    // This method is called if TEXT_PLAIN is request
    @GET
    @Produces(MediaType.APPLICATION_JSON)   
    public JResponse<List<Region>> region() {
        RegionDao regionDao = new RegionDao();
        regionDao.openSession();
        List<Region> regions = regionDao.getAll();
        regionDao.closeSession();
        return JResponse.ok(regions).build();
    }
}
这是堆栈跟踪:
SEVERE: Mapped exception to response: …我有一个方法:
@POST
@Consumes("multipart/form-data")
@Produces( {"text/xml"})
public Response processForm(
    @FormDataParam("myparam") InputStream is,
    @FormDataParam("myparam") FormDataContentDisposition detail)
这与Jersey 1.x一起运作良好.
我升级到2.0 m11.
现在我收到以下错误:
12/01/2013 11:15:04 AM org.glassfish.jersey.server.ApplicationHandler initialize
INFO: Initiating Jersey application, version Jersey: 2.0-m11 2012-12-21 12:34:15...
12/01/2013 11:15:04 AM org.glassfish.jersey.internal.Errors processErrors
SEVERE: The following errors and warnings have been detected:
WARNING: No injection source found for a parameter of type public javax.ws.rs.core.Response com.plutext.FileUpload.processForm(java.io.InputStream,org.glassfish
.jersey.media.multipart.FormDataContentDisposition) at index 0.
我找到了 http://java.net/jira/browse/JERSEY-1413并提交了http://java.net/projects/jersey/lists/commits/archive/2012-09/message/126这似乎相关,但它的对我来说不明白如何解决这个问题.
更新
我创建了一个servlet,它在org.glassfish.jersey.server.ApplicationHandler初始化之前在Tomcat中运行:
public class Jersey2Init extends HttpServlet {
    private static final …我正在使用本教程中描述的身份验证/授权机制构建休息服务:http://howtodoinjava.com/2013/06/26/jax-rs-resteasy-basic-authentication-and-authorization-tutorial/
基本上它使用PreProcessInterceptor接口来扫描目标方法的注释(来自javax.annotation.security包),该方法描述了访问该方法所需的角色.由于此处的验证器是拦截器,它可以取消目标方法调用,如果需要则返回401(未授权).
这里的问题是在当前的RestEasy版本(3.0.1)中不推荐使用接口org.jboss.resteasy.spi.interception.PreProcessInterceptor,并且我在尝试使用标准JAX-RS接口实现相同的行为时遇到了问题.
我正在使用javax.ws.rs.ext.ReaderInterceptor接口来拦截调用.但不知何故,服务器从不调用它:拦截器只是被忽略了.
我正在使用与之前的PreProcessInterceptor相同的方式注册拦截器/资源,并使用相同的@Provider和@ServerInterceptor注释:
ServerApplication:
public class ServerApplication extends javax.ws.rs.core.Application {
     private final HashSet<Object> singletons = new LinkedHashSet<Object>();
     public ServerApplication() {
         singletons.add(new SecurityInterceptor());
         singletons.add( ... ); //add each of my rest resources
     }
    @Override
    public Set<Class<?>> getClasses() {
        HashSet<Class<?>> set = new HashSet<Class<?>>();
        return set;
    }
    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }
}
SecurityInterceptor:
@Provider
@ServerInterceptor
public class SecurityInterceptor implements javax.ws.rs.ext.ReaderInterceptor {
     @Override
     public Object aroundReadFrom(ReaderInterceptorContext context){
            //code that is …