标签: jax-rs

在JAX-RS中使用@ Context,@ Extider和ContextResolver

我刚刚熟悉使用JAX-RS在Java中实现REST Web服务,我遇到了以下问题.我的一个资源类需要访问存储后端,该后端在StorageEngine接口后面被抽象出来.我想将当前StorageEngine实例注入服务于REST请求的资源类中,我认为这样做的好方法是使用@Context注释和适当的ContextResolver类.这是我到目前为止:

MyResource.java:

class MyResource {
    @Context StorageEngine storage;
    [...]
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用com.sun.jersey.api.core.PackagesResourceConfig自动发现提供程序和资源类,并根据日志,它StorageEngineProvider很好地获取类(时间戳和故意遗漏的不必要的东西):

INFO: Root resource classes found:
    class MyResource
INFO: Provider classes found:
    class StorageEngineProvider
Run Code Online (Sandbox Code Playgroud)

但是,storage我的资源类中的值总是如此null- Jersey的调用器StorageEngineProvider及其getContext方法都不会被调用.我在这做错了什么?

java jax-rs jersey

30
推荐指数
2
解决办法
4万
查看次数

如何在Heroku上使用JAX-RS找出传入的RESTful请求的IP?

我正在基于一个示例编写一个托管在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();
    }

}
Run Code Online (Sandbox Code Playgroud)

我的主要是:

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 …
Run Code Online (Sandbox Code Playgroud)

rest jax-rs heroku jersey grizzly

30
推荐指数
3
解决办法
3万
查看次数

org.glassfish.jersey.internal.RuntimeDelegateImpl未找到

我正在为我的项目使用jersey,并从字符串中解析URI.

UriBuilder.fromUri("http://localhost:8000").build();
Run Code Online (Sandbox Code Playgroud)

代码很简单,但我在下面收到错误

java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl
Run Code Online (Sandbox Code Playgroud)

似乎程序找不到代理人.我已导入javax.ws.rs.core.UriBuilder并且jersey-common 2.0应该在我的构建路径中包含委托.但我仍然得到这个错误.

有人知道如何解决它吗?谢谢!

java rest glassfish jax-rs jersey

29
推荐指数
4
解决办法
4万
查看次数

设计模式为Web服务建模请求和响应对象

我有大约7个REST Web服务要实现.其中一些Web服务具有标准(相同)响应,而一些响应不同.

对这些Web服务的请求是不同的,但是一些请求和一些响应具有相同的底层数据对象.

我不确定是否必须为每个Web服务构建单独的请求/响应类或重用标准服务.我想知道是否有一个设计模式来为这些Web服务建模请求对象和响应对象.

好吧,说帐户和书籍是我的网络服务将要处理的两个休息资源.

class Account {
    String username;
    String id;
}


class Book {
    String title;
    String isbn;
}
Run Code Online (Sandbox Code Playgroud)

所以我的网络服务看起来像这样:

MYAPI/CreateAccountandBook
MYAPI/Account/Create
MYAPI/Book/Create
MYAPI/Book/Update/{isbn}
MYAPI/Account/Update/{id}
MYAPI/Account/getInfo/{id} 
Run Code Online (Sandbox Code Playgroud)

等等.

现在CreateAccountandBook请求将获取有效负载中的帐户对象和书籍列表.此外,响应对象MYAPI/Account/getInfo/{id}还有一个帐户对象和与该帐户关联的书籍列表.但响应对象还包括一个statusCodeDescription.

现在我想以最好的方式为这些请求和响应对象创建类.

好的开始.

我有两个抽象类StandardRequestStandardResponse.

所有请求类都将扩展标准请求类并相应地进行自定义.所有响应类都将扩展标准响应类并相应地进行自定义.

但是这些请求和响应可能彼此不同,但仍然重用相同的实体对象.

例如:

createAccountandBook 请求对象如下所示:

class CreateAccountAndBookRequest {
   Account account;
   List<Book> books;
}
Run Code Online (Sandbox Code Playgroud)

而对getInfoWeb服务的响应是:

class GetInfoResponse {
   Account account;
   List<Book> books;
   String statusCode;
   String description;
}
Run Code Online (Sandbox Code Playgroud)

所以请求和响应类之间存在重叠.我可以为每个Web服务创建两个(req/res)类.但是想知道是否有更好的方法来模拟这些类.

java rest design-patterns web-services jax-rs

29
推荐指数
2
解决办法
4万
查看次数

如何重用Jersey的JSON/JAXB进行序列化?

我有一个使用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;
}
Run Code Online (Sandbox Code Playgroud)

泽西可以将其中一个变成json而没有额外的信息.我想知道泽西是否已经在API中公开了这个功能,以满足我的需求?到目前为止我找不到运气了......

谢谢!

更新2009-07-09:我已经了解到我可以使用Providers对象几乎完全按照我的意愿行事:

  @Context Providers ps; …
Run Code Online (Sandbox Code Playgroud)

json jax-rs jersey

28
推荐指数
3
解决办法
5万
查看次数

找不到Java类型的消息正文编写器,类myPackage.B和MIME媒体类型application/octet-stream

我是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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

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") …
Run Code Online (Sandbox Code Playgroud)

rest web-services jax-rs jersey java-ee-6

28
推荐指数
1
解决办法
12万
查看次数

在泽西使用Gson代替杰克逊

我有一个消耗和生成JSON对象的RESTful服务,我希望Jersey使用Gson而不是Jackson.

如何才能做到这一点...?

jax-rs jaxb jersey jackson gson

28
推荐指数
2
解决办法
3万
查看次数

Java类java.util.ArrayList的消息体编写器

在访问我的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
Run Code Online (Sandbox Code Playgroud)

这是我的资源类和方法:

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是堆栈跟踪:

SEVERE: Mapped exception to response: …
Run Code Online (Sandbox Code Playgroud)

java list jax-rs jersey

28
推荐指数
3
解决办法
5万
查看次数

泽西2注射源为multipart formdata

我有一个方法:

@POST
@Consumes("multipart/form-data")
@Produces( {"text/xml"})
public Response processForm(
    @FormDataParam("myparam") InputStream is,
    @FormDataParam("myparam") FormDataContentDisposition detail)
Run Code Online (Sandbox Code Playgroud)

这与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.
Run Code Online (Sandbox Code Playgroud)

我找到了 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 …
Run Code Online (Sandbox Code Playgroud)

java multipartform-data jax-rs jersey tomcat7

28
推荐指数
2
解决办法
5万
查看次数

什么是Resteasy 3.X PreProcessInterceptor的正确替代品?

我正在使用本教程中描述的身份验证/授权机制构建休息服务: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;
    }
}
Run Code Online (Sandbox Code Playgroud)

SecurityInterceptor:

@Provider
@ServerInterceptor
public class SecurityInterceptor implements javax.ws.rs.ext.ReaderInterceptor {
     @Override
     public Object aroundReadFrom(ReaderInterceptorContext context){
            //code that is …
Run Code Online (Sandbox Code Playgroud)

java rest jax-rs resteasy

28
推荐指数
1
解决办法
2万
查看次数