Tag: 泽西

自定义Jerseyerror handling,如何在客户端捕获响应?

我正在尝试在我的webservice上进行一些自定义error handling。 在我的webservice中,我创建了一个自定义的Exception类,扩展了WebApplicationException,如JAX-RS / Jersey中所描述的, 如何自定义error handling? : public class InternalServerErrorException extends WebApplicationException { public InternalServerErrorException(String message) { super(Response.status(Response.Status.INTERNAL_SERVER_ERROR) .header(“errorMessage”, message).type(MediaType.TEXT_PLAIN).build()); System.out.println(message); } } 为了测试,我有一个简单的国家/地区服务,它提供了一个国家列表。 我确保测试抛出InternalServerErrorException会发生错误: @GET @Override @Path(“countries”) @Produces({“application/xml”}) public List findAll() { try { int i = Integer.parseInt(“moo”); //<– generate error List countries = super.findAll(); return countries; } catch (Exception ex) { throw […]

Jersey – 有没有办法用参数实例化Per-Request资源?

假设我有这个课程: @Path(“/test”) public class TestResource{ private TestService testService; public TestResource(TestService testService){ this.testService = testService; } @GET public String getMessage(){ return testService.getMessage(); } } 然后,我想在泽西岛注册。 一个会这样做: TestService testService = new TestServiceImpl(); resourceConfig.register(new TestResource(testService)); 但问题是该方法构成了TestResource的单个实例。 我想根据请求创建一个实例。 所以,泽西有一种方法可以做到这一点: TestService = new TestServiceImpl(); resourceConfig.register(TestResource.class); 那样太好了! 但它不允许我将实例化参数传递给它的构造函数。 最重要的是,我正在使用DropWizard,它也不允许我从ResourceConfig访问所有方法(但我检查了它的文档,但没有找到任何让我传递参数的方法) 所以我想知道是否有办法实现这一目标。 谢谢! PS:我知道我可以使用Spring或Guice(或我自己的实例提供程序)并注入我的类来逃避这一点,但我不想这样做(当然,如果这是唯一的方法我会这样做)

是否有可能在Jersey中访问注入的HttpServletRequest,而不是代理

在Jersey / JAX-RS资源中注入HttpServletRequest时,注入的值是代理。 例如: @Path(“/myResource”) class MyResource { @Inject HttpServletRequest request; … } 将为请求的HttpServletRequest注入一个Proxy对象。 我需要访问实际的HttpServletRequest实例对象,因为我想使用一些不在代理HttpServletRequest接口中的容器特定function。 在jersey中有没有办法通过注射进入实际物体? 我知道在旧版本的Jersey中你可以注入ThreadLocal来实现这一点。 但这似乎不再支持jersey2.15了。 基本原理:我的代码依赖于实现HttpRequest org.eclipse.jetty.server.Request中的function,并添加了HTTP / 2推送的function。 我想用Jersey / JAX-RS。

访问Tomcat服务器上的Web应用程序资源时出现NoSuchMethodError

在线搜索后,这是一个我无法找到答案的问题。 我的Web应用程序部署到tomcat服务器,我知道这一切都在起作用,因为index.jsp显示了文本。 但是当我尝试访问我已经创建的资源应该打印出hello world时,tomcat服务器返回此消息 java.lang.NoSuchMethodError: com.sun.jersey.core.spi.component.ProviderServices.(Lcom/sun/jersey/core/spi/factory/InjectableProviderFactory;Lcom/sun/jersey/core/spi/component/ProviderFactory;Ljava/util/Set;Ljava/util/Set;)V com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:450) com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:383) com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:377) com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:242) com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:449) com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:169) com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:281) com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:442) javax.servlet.GenericServlet.init(GenericServlet.java:212) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) java.lang.Thread.run(Unknown Source) 是否有任何人有任何想法或线索,为什么这将发生,这将有助于我解决这个问题? 任何帮助非常感谢谢谢克里斯

如何使用自定义Dropwizardfilter可选地保护资源

我正在使用Dropwizard 0.9.2,我想创建一个不需要GET身份validation的资源,并且需要对POST进行基本身份validation。 我努力了 @Path(“/protectedPing”) @Produces(MediaType.TEXT_PLAIN) public class ProtectedPing { @GET public String everybody() { return “pingpong”; } @PermitAll @POST public String authenticated(){ return “secret pingpong”; } 同 CachingAuthenticator ca = new CachingAuthenticator(environment.metrics(), ldapAuthenticator, cbSpec); AdminAuthorizer authorizer = new AdminAuthorizer(); BasicCredentialAuthFilter bcaf = new BasicCredentialAuthFilter.Builder().setAuthenticator(ca).setRealm(“test-oauth”).setAuthorizer(authorizer).buildAuthFilter(); environment.jersey().register(bcaf); environment.jersey().register(RolesAllowedDynamicFeature.class); environment.jersey().register(new AuthValueFactoryProvider.Binder(User.class)); environment.jersey().register(new ProtectedPing()); 这似乎导致所有要求“/ protectedPing”的请求需要基本身份validation。 在Dropwizard 0.9.2中,文档说如果我有一个可选的受保护资源,则创建一个自定义filter。 我假设我需要这样做,但我不知道从哪里开始,或者我是否真的需要做什么。

如何在不手动转换为JSON的情况下使用Jersey客户端发布Pojo?

我有一个工作json服务,看起来像这样: @POST @Path(“/{id}/query”) @Consumes(MediaType.APPLICATION_JSON) @Produces(JSON) public ListWrapper query(@Context SecurityContext sc, @PathParam(“id”) Integer projectId, Query searchQuery) { … return result } 查询对象看起来像这样,当发布该Query对象的json表示时,它很好用。 @XmlRootElement public class Query { Integer id; String query; … // Getters and Setters etc.. } 现在我想从客户端填充该对象,并使用Jersey客户端将该Query对象发布到服务并获取JSONObject作为结果。 我的理解是,它可以在不首先将其转换为json对象然后作为String发布的情况下完成。 我尝试过类似的东西,但我觉得我错过了一些东西。 public static JSONObject query(Query searchQuery){ String url = baseUrl + “project/”+searchQuery.getProjectId() +”/query”; WebResource webResource = […]

在Jersey webapp启动时初始化数据库

我读过这个,但我不太明白它是如何工作的。 我想在我的Web应用程序启动时加载属性文件并设置我的连接池。 显然我只想在一个地方做一次,所以如果需要我可以改变它。 使用常规servlet,我只需将初始化代码放在servlet的init()方法中,但是您无法使用Jersey servlet访问它。 那我该怎么办? 上面链接中的听众如何工作?

泽西客户端+设置代理

嗨,我有一个用于上传文件的jersey客户端。 我尝试在本地使用它,一切正常。 但在生产环境中,我要设置代理。 我浏览了几页,但无法得到确切的解决方案。 有人可以帮我这个吗? 这是我的客户代码: File file = new File(“e:\\test.zip”); FormDataMultiPart part = new FormDataMultiPart(); part.bodyPart(new FileDataBodyPart(“file”, file, MediaType.APPLICATION_OCTET_STREAM_TYPE)); WebResource resource = null; if(proxy.equals(“yes”)){ //How do i configure client in this case? }else{ //this uses system proxy i guess resource = Client.create().resource(url); } String response = (String)resource.type(MediaType.MULTIPART_FORM_DATA_TYPE).post(String.class, part); System.out.println(response);

如何从与Jersey的多部分表单中读取具有相同名称的多个(文件)输入?

我已经成功开发了一项服务,我在其中阅读在泽西岛以多部分forms上传的文件。 这是我一直在做的非常简化的版本: @POST @Path(“FileCollection”) @Consumes(MediaType.MULTIPART_FORM_DATA) public Response uploadFile(@FormDataParam(“file”) InputStream uploadedInputStream, @FormDataParam(“file”) FormDataContentDisposition fileDetail) throws IOException { //handle the file } 这工作得很好,但我已经给了一个新的要求。 除了我上传的文件外,我还要处理任意数量的资源。 我们假设这些是图像文件。 我想我只是为客户端提供一个表单,其中包含一个文件输入,第一个图像的一个输入和一个允许向表单添加更多输入的按钮(使用AJAX或简单的JavaScript)。 因此,用户可以为表单添加更多图像输入,如下所示: 我希望阅读与集合同名的字段非常简单。 我在MVC .NET中使用文本输入成功完成了它,我认为在Jersey中不会更难。 事实certificate我错了。 找不到关于这个主题的教程,我开始尝试。 为了看看如何做到这一点,我把问题简化为简单的文本输入。 Multiple inputs with the same name 显然,我需要将某种集合作为我方法的参数。 这是我尝试过的,按集合类型分组。 排列 起初,我检查了Jersey是否足够智能来处理一个简单的数组: @POST @Path(“FileCollection”) @Consumes(MediaType.MULTIPART_FORM_DATA) public Response uploadFile(@FormDataParam(“test”) String[] inputs) { //handle the request } 但arrays未按预期注入。 […]