任何人都可以告诉我如何使用Jersey 2.0制作一个安静的Web服务.我到处搜索并找到Jersey1.x版本的教程,但不是2.0.请帮忙
我已将我的Web应用程序升级到JAX-RS 2.0.
Web应用程序似乎在Apache Tomcat上运行良好.但是,它不会部署在Weblogic 12c(甚至10.3.6)上.
我不确定weblogic是否有适当的支持,我相信它需要一些配置和类加载器过滤来覆盖默认的JAX-RS 1.1实现?
知道如何实现这一点并让我的Web应用程序在WLS 12c上运行吗?
我正在从Jersey 1.x移植一些代码,并且我对各种运行状况检查端点的实现依赖于@Singleton
在启动时初始化的所有端点资源,以便能够检测要执行的检查.
在Jersey 2.0中 - 无论我做什么,我似乎无法让我的资源端点在启动时初始化,并且它们仅在第一次访问每个端点时被构造+初始化.
我想我可以在Application
课堂上自己初始化它们,但我宁愿使用包扫描!
有没有人知道是否有一些配置选项会告诉Jersey 2急切地初始化它在包扫描期间找到的所有资源端点?
还是一些HK2注释或技巧?
我试图将泽西与Grizzly一起用作自托管
基本上我的主要是:
org.glassfish.jersey.server.ResourceConfig rc = new ResourceConfig();
rc.registerClasses(DummyController.class);
webServer = GrizzlyHttpServerFactory.createHttpServer(uri, rc, false);
System.out.println("Server Created");
try {
webServer.start();
System.out.println("Server Started");
} catch (IOException e) {
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个小型控制器:
@Path("/")
public class DummyController {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String get() {
return "Got it!";
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行它时,我得到一个例外:
Exception in thread "main" java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:309)
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:289)
at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.<init>(GrizzlyHttpContainer.java:331)
at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory.createHttpServer(GrizzlyHttpServerFactory.java:141)
at RestServer.Server.main(Server.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Run Code Online (Sandbox Code Playgroud)
当我没有添加资源时,灰熊服务器运行正常,但我无法访问任何控制器
我使用Maven下载所有依赖项
这是pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" …
Run Code Online (Sandbox Code Playgroud) 我正在使用Java Jersey 2.17构建RESTful Web服务.客户端.我正在使用ExtJS 5进行开发.
我的服务课程
Main.java
public class Main
{
public static final String BASE_URI = "http://localhost:8080/app/rest/";
public static HttpServer startServer() {
final ResourceConfig rc = new ResourceConfig();
rc.packages(true, "app");
rc.register(ResponseCorsFilter.class);
return GrizzlyHttpServerFactory.createHttpServer(URI.create(Main.BASE_URI), rc);
}
public static void main(final String[] args) throws IOException {
final HttpServer server = Main.startServer();
System.out.println(String.format("Jersey app started with WADL available at " + "%sapplication.wadl\nHit enter to stop it...",
Main.BASE_URI));
System.in.read();
server.stop();
}
}
Run Code Online (Sandbox Code Playgroud)
UserRi.java
@Path("/user")
public class UsersRi {
@DELETE
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public String …
Run Code Online (Sandbox Code Playgroud) 我写了一个RESTful Web服务.下面是我的maven依赖项.
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.17</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.6</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.3.3</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>jaxrs-api</artifactId>
<version>3.0.12.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.spec.javax.annotation</groupId>
<artifactId>jboss-annotations-api_1.1_spec</artifactId>
<version>1.0.1.Final</version>
</dependency>
<dependency>
<groupId>net.jcip</groupId>
<artifactId>jcip-annotations</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.0.12.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.0.12.Final</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId> …
Run Code Online (Sandbox Code Playgroud) 在 Jersey 中使用拦截器我可以操作输出,但是,我还想向响应添加一个 Header,该值是根据输出结果计算的。
@Sha256Sum
public class Sha256SumInterceptor implements WriterInterceptor {
public static final String SHA256_HASH_HEADER_NAME = "SHA256-SUM";
@Override
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
// Retrieve the OutputStream, read the contents and calculate the hashsum.
// Set the header value in context.
context.proceed();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,问题是当我最终阅读了整个流时,我无法将标题设置为调用 context.proceed 和写入的内容(从而使我能够对其进行任何操作)我无法再设置标题。
简而言之,我的问题是:如何将整个流输出捕获为字节 [],从字节数组计算结果,并最终在对计算结果的响应中设置标头?我不想耗尽输出流。
我想按字段为单个请求注入一个数据存储区,比如
@Context
protected HttpServletRequest request;
Run Code Online (Sandbox Code Playgroud)
目前我已经实现了类似的方法: Jersey 2.x自定义注入注释具有属性 如下:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.FIELD})
public @interface TenantDatastore {}
Run Code Online (Sandbox Code Playgroud)
public class TenantDatastoreFactory extends AbstractContainerRequestValueFactory<Datastore> {
public TenantDatastoreFactory() {}
@Override
public Datastore provide() {
ContainerRequest request = getContainerRequest();
return DatastoreManager.getDs(request.getHeaders().get("Host")));
}
@Override
public void dispose(Datastore d) {}
}
Run Code Online (Sandbox Code Playgroud)
public class TenantDatastoreFactoryProvider extends AbstractValueFactoryProvider {
private final TenantDatastoreFactory tenantDatastoreFactory;
@Inject
public TenantDatastoreFactoryProvider(
final MultivaluedParameterExtractorProvider extractorProvider,
ServiceLocator locator,
TenantDatastoreFactory tenantDatastoreFactory) {
super(extractorProvider, locator, Parameter.Source.UNKNOWN);
this.tenantDatastoreFactory = tenantDatastoreFactory;
}
@Override
protected Factory<?> createValueFactory(Parameter parameter) {
Class<?> paramType …
Run Code Online (Sandbox Code Playgroud) 带有令牌身份验证+基于角色的授权的Jersey 2.22 API(我保护API的方式基于本文的公认答案:使用JAX-RS和Jersey进行基于REST令牌身份验证的最佳实践。最好在阅读之前阅读它试图理解我的问题):
这是我的web.xml:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- LISTENERS -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>JerseySpringServlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>ca.toto.api.filters</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>ca.toto.api.restapi</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>ca.toto.api.filters.AuthenticationFilter;ca.toto.api.filters.AuthorizationFilter;com.toto.api.restapi.TaskRestService</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JerseySpringServlet</servlet-name>
<url-pattern>/filters/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>JerseySpringServlet</servlet-name>
<url-pattern>/restapi/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
当我调用任务 Web服务时,流程毫无问题地进入第一个过滤器(AuthenticationFilter)(@Priority(Priorities.AUTHENTICATION)),验证我的令牌,从解码的令牌中获取用户,然后将其注册为委托人然后传入第二个过滤器AuthorizationFilter(@Priority(Priorities.AUTHORIZATION)),在这里我从安全上下文中获取用户,获取其角色,然后检查他是否有权进行调用。如果是,请正常退出过滤器(如果否),请使用javax.ws.rs.container.ContainerRequestContext。abortWith方法发送状态为403的响应:
@Secured
@Provider
@Priority(Priorities.AUTHORIZATION)
public class AuthorizationFilter implements ContainerRequestFilter {
...
try {
boolean isAllowed = false;
// Check if the …
Run Code Online (Sandbox Code Playgroud) 我有一个使用 Spring Boot(2.0.0) 和 Jersey 的非常基本的应用程序。不幸的是,当我尝试调用暴露的端点时,我收到错误 404。
我的代码如下所示:
主要类:
public class App {
public static void main( String[] args ) {
SpringApplication.run(App.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
泽西配置:
@Component
@ApplicationPath("/api")
public class JerseyConfig extends ResourceConfig{
public JerseyConfig() {
register(FileResource.class);
}
}
Run Code Online (Sandbox Code Playgroud)
资源:
@Component
@Consumes(MediaType.APPLICATION_JSON)
public class FileResource {
@POST
@Path("/uploadfile")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void upload(@FormDataParam("file") InputStream fileInputStream,
@FormDataParam("file") FormDataContentDisposition disposition) {
System.out.println(disposition.getName());
}
@GET
@Path("/foo")
public String foo() {
return "foo";
}
}
Run Code Online (Sandbox Code Playgroud)
Maven 依赖项:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> …
Run Code Online (Sandbox Code Playgroud) jersey-2.0 ×10
java ×9
rest ×4
jersey ×3
grizzly ×2
jax-rs ×2
ajax ×1
dropwizard ×1
hk2 ×1
httpresponse ×1
maven ×1
weblogic12c ×1