Tag: jersey

如何干净地覆盖Jersey使用的默认ServiceLocator?

我正在开发一个应用程序,它使用Jersey(2.5)作为其REST前端,Jetty作为嵌入式HTTP(S)服务器,两者都采用所谓的“嵌入式”方式,例如。 不依靠制作.war并部署它,而是通过处理程序,资源,注入的程序化配置…… 我想以某种方式覆盖Jersey在服务器端使用的HK2 ServiceLocator ,或者可能为父服务定位器提供一个父服务器来解析在应用程序的REST部分之外定义的依赖关系。 从我看到的代码来看,这似乎不可能:ServiceLocator通过调用Injections在ApplicationHandler实例化: if (customBinder == null) { this.locator = Injections.createLocator(new ServerBinder(application.getProperties()), new ApplicationBinder()); } else { this.locator = Injections.createLocator(new ServerBinder(application.getProperties()), new ApplicationBinder(), customBinder); } 注射中的代码告诉我以下内容: public static ServiceLocator createLocator(Binder… binders) { return _createLocator(null, null, binders); } 这意味着新创建的服务定位器具有一些任意生成的名称,并且没有父项。 有没有(干净的)方法来改变这种行为,以便我注入我自己的ServiceLocator作为应用程序的父级?

如何在泽西岛列出所有已注册的JAX-RS实体提供商

让我们假设我有一个简单的泽西应用程序, 在github上嵌入了jetty Demo项目,下面是基本代码。 回到jersey1的日子,我有日志消息: мая 07, 2016 5:05:50 AM com.sun.jersey.api.core.PackagesResourceConfig init INFO: Scanning for root resource and provider classes in the packages: ru.varren мая 07, 2016 5:05:50 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses INFO: Root resource classes found: class ru.varren.MyResource мая 07, 2016 5:05:50 AM com.sun.jersey.api.core.ScanningResourceConfig logClasses INFO: Provider classes found: class ru.varren.JsonProvider мая 07, 2016 5:05:50 AM […]

在Osgi中以编程方式注册ServletContainer

我正在开发一个带有OSGI的JAX-RS应用程序,其中资源是动态加载的。 为此,我需要以编程方式注册ServletContainer,然后我可以调用方法ServletContainer.reload(ResourceConfig)。 我正在运行OSGI环境,支持servlet 3.x,使用PAX-WEB 3.0.2和Jersey 2.4。 问题是当我想访问实现Server Sent Event的资源时,Jersey会引发一个不支持异步的错误,因为它在Servlet 2.x中运行。 这里例外: 2013-11-05 00:22:37,675 | WARN | qtp27902282-62 | ServletHandler | pse.jetty.servlet.ServletHandler 492 | 60 – org.eclipse.jetty.aggregate.jetty-all-server – 8.1.9.v20130131 | javax.servlet.ServletException: java.lang.UnsupportedOperationException: Asynchronous processing not supported on Servlet 2.x container. at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)[224:org.glassfish.jersey.containers.jersey-container-servlet-core:2.3.1] at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:372)[224:org.glassfish.jersey.containers.jersey-container-servlet-core:2.3.1] at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335)[224:org.glassfish.jersey.containers.jersey-container-servlet-core:2.3.1] at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:218)[224:org.glassfish.jersey.containers.jersey-container-servlet-core:2.3.1] at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1448)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131] at org.ops4j.pax.web.service.internal.WelcomeFilesFilter.doFilter(WelcomeFilesFilter.java:185)[70:org.ops4j.pax.web.pax-web-runtime:3.0.2] at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419)[60:org.eclipse.jetty.aggregate.jetty-all-server:8.1.9.v20130131] […]

如何在Jersey容器中配置欢迎文件(HTML / JSP)

我有一个Jersey RESTful Web服务项目。 我已经在web.xml中配置了Jersey容器,一切正常。 在同一个项目中,我引入了一个HTML页面并包含在以处理其他一些非REST请求。 但是当我访问URL时,不会显示欢迎文件。 在web.xml中评论Jersey容器配置并部署应用程序后,这次我可以访问欢迎文件。 我使用的是Tomcat 7,JDK 7,Jersey 2.2和Eclipse Juno。 Jersey配置后如何使欢迎文件正常工作? Jersey有没有限制,还是需要以不同的方式配置才能实现这一目的? 我的web.xml : My Service Jersey REST Service org.glassfish.jersey.servlet.ServletContainer jersey.config.server.provider.packages com.my.rest.service 1 Jersey REST Service /* index.html index.htm index.jsp default.html default.htm

泽西URL转发

在Jersey REST方法中,我想转发到另一个网站。 我怎样才能做到这一点? @Path(“/”) public class News { @GET @Produces(MediaType.TEXT_HTML) @Path(“go/{news_id}”) public String getForwardNews( @PathParam(“news_id”) String id) throws Exception { //how can I make here a forward to “http://somesite.com/news/id” (not redirect)? return “”; } } 编辑: 尝试执行以下操作时,我No thread local value in scope for proxy of class $Proxy78错误的No thread local value in scope for proxy of […]

如何将Jersey ExceptionMapper与Google Guice一起使用?

我正在使用Jersey Guice,需要配置自定义的ExceptionMapper 我的模块看起来像这样: public final class MyJerseyModule extends JerseyServletModule { @Override protected void configureServlets() { … filter(“/*”).through(GuiceContainer.class); … } } 这是我的ExceptionMapper : import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.ext.ExceptionMapper; public class MyExceptionMapper implements ExceptionMapper { @Override public Response toResponse(final MyException exception) { return Response.status(Status.NOT_FOUND).entity(exception.getMessage()).build(); } }

如何在ContainerRequest中获取会话对象以使用注释@RolesAllowed(Role_user)?

我正在使用带引擎的App Engine构建应用程序。 我想使用允许在请求中创建filter的注释@RolesAllowed(Role_user) 。 问题是我们需要配置SecurityContextFilter类。 我的目标是获取存储在会话中的用户的id ,然后直接在function : public ContainerRequest filter(ContainerRequest request)检查它们的角色function : public ContainerRequest filter(ContainerRequest request)我的类SecurityContextFilter function : public ContainerRequest filter(ContainerRequest request) 。 我需要注入HttpRequest来获取会话,但是当我注入它时,我得到一个exceptionJava.lang.Null 。 我想在ContainerRequest类中获取一个会话Object。 我怎样才能做到这一点? 编辑: 我已经找到了解决这个问题的方法,但我不知道这是否干净:你可以直接在函数中注入HttpRequest:isUserInRole(_role)所以我使用这个,然后我通过session得到我的userId然后得到角色用户我检查是否匹配_role并返回true或false。

在预检响应中,Access-Control-Allow-Methods不允许使用方法DELETE

我正在使用泽西作为我的restful api实现。 在前端,我使用angularjs $ http服务来发出http请求。 当我请求删除方法时,我总是得到以下错误。 “Method DELETE is not allowed by Access-Control-Allow-Methods in preflight response.” 我读了一些文章,他们说我需要允许删除“Access-Control-Allow-Methods”。 我已经设置了如下的响应filter,但它仍然存在这样的问题。 我还该怎么办? @Provider public class CORSResponseFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { MultivaluedMap headers = responseContext.getHeaders(); headers.add(“Access-Control-Allow-Origin”, “*”); headers.add(“Access-Control-Allow-Methods”, “*”); } } 下面是我提出请求的角度代码: $http({ method: ‘DELETE’, url: remoteUrl, headers : {‘Content-Type’: […]

JAX-RS 2.0通过@NameBinding注释过滤参数

我创建了一些JAX-RS 2.0资源(使用在Servlet容器中运行的Jeresey 2.4)和一个处理身份validation和授权的filter,可以通过@NameBinding注释有选择地应用。 一切都很好。 我希望能够在此注释上定义一些参数(特别是访问每个方法/资源所需的安全权限),这些参数在运行时可用于filter以改变此行为。 我注意到拦截器可以通过javax.ws.rs.ext.InterceptorContext.getAnnotations()执行此操作,但在filter的javax.ws.rs.container.ContainerRequestContext中没有等效项。 有什么想法可以实现吗? 我希望能够做类似以下的事情: @Target({TYPE, METHOD}) @Retention(value = RetentionPolicy.RUNTIME) @NameBinding public @interface Secured { String[] requiredPermissions() default {}; } @Secured @Priority(Priorities.AUTHENTICATION) public class SecurityRequestFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext containerRequestContext) throws IOException { // extract credentials, verify them and check that the user has required permissions, aborting if not […]

如何在Rest Web服务中获取ServletContext

我正在使用Jersey实现rest web服务。 我需要有ServletContext的对象将文件保存在应用程序目录中。 请帮助我了解上下文。 我从android设备调用这个web服务。 提前致谢。 @Path(“notice”) public class NoticeResources { @Resource private ServletContext context; @POST @Path(“uploadphoto”) @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(“text/plain”) public String uploadNotices(@FormDataParam(“file”) InputStream uploadedInputStream) { File photoDirectory = new File(“\\photo”); // if the directory does not exist, create it if (!photoDirectory.exists()) { boolean result = photoDirectory.mkdir(); if(result){ System.out.println(“DIR created”); } } String rootPath = photoDirectory.getAbsolutePath(); […]