任何人都可以通过不使用maven告诉我如何使用Jersey 2.0制作一个宁静的Web服务.我到处搜索并找到Jersey1.x版本的教程,但不是2.0.请帮忙
在Jersey 1.x中,您可以使用ContainerRequest.getFormParameters()
对表单数据执行请求筛选,但我没有在Jersey 2.x中看到明显的等效项.我已经实现了ContainerRequestFilter
界面,让我可以访问a ContainerRequestContext
,但从那里如何获取表单数据?
泽西岛1.x例子:
public class MyFilter implements ContainerRequestFilter {
public ContainerRequest filter(ContainerRequest request) {
Form f = request.getFormParameters();
// examine form data and filter as needed
}
}
Run Code Online (Sandbox Code Playgroud)
泽西岛2.x例子:
public class MyFilter implements ContainerRequestFilter {
public void filter(ContainerRequestContext context) {
// how do I get to the Form data now?
}
}
Run Code Online (Sandbox Code Playgroud) 对于异步编程,Jersey(JAX-RS)提供了一个ConnectionCallback
在连接断开时执行的回调.来自泽西岛的文档:
由于某些异步请求可能需要很长时间来处理,因此客户端可能决定在恢复响应之前或者在完全写入客户端之前终止其与服务器的连接.为了处理这些用例,可以使用ConnectionCallback.只有在将响应写入后端客户端时,连接过早终止或丢失,才会执行此回调.请注意,成功写入响应并按预期关闭客户端连接时,不会调用此回调.
听起来不错,但我永远无法解决这个问题.
这是一些代码:
@GET
@Produces(MediaType.TEXT_PLAIN)
@ManagedAsync
@Path("/poll")
public void poll(@Suspended final AsyncResponse asyncResponse) {
asyncResponse.register(new CompletionCallback() {
@Override
public void onComplete(Throwable throwable) {
logger.info("onComplete called.");
}
});
asyncResponse.register(new ConnectionCallback() {
@Override
public void onDisconnect(AsyncResponse disconnected) {
logger.info("onDisconnect called.");
}
});
asyncResponse.setTimeout(POLL_TIMEOUT_SECONDS, TimeUnit.SECONDS);
asyncResponse.setTimeoutHandler(new TimeoutHandler() {
@Override
public void handleTimeout(AsyncResponse asyncResponse) {
logger.info("handleTimeout called.");
asyncResponse.resume(Response.status(Response.Status.OK).entity("TIMEOUT").build());
}
});
}
Run Code Online (Sandbox Code Playgroud)
显示的另外两个回调,CompletionCallback和TimeoutHandler,可以正常启动,但不会失败.如果达到指定的超时持续时间,则会触发TimeoutHandler.如果恢复AsyncResponse实例,则会触发CompletionCallback.
但是,使用ConnectionCallback,我可以关闭,终止或以其他方式停止连接到上面显示的Web服务的客户端,并且ConnectionCallback永远不会被触发.
我错过了什么吗?ConnectionCallback是否在泽西实施?(它在JAX-RS规范中是可选的,但Jersey文档谈论它就好像已经实现了.)
任何输入将不胜感激.
是否有任何实现javax.ws.rs.core.UriInfo
可用于快速创建实例以进行测试.这个界面很长,我只需要测试一下.我不想在这个界面的整个实现上浪费时间.
更新:我想为类似于此的函数编写单元测试:
@GET
@Path("/my_path")
@Produces(MediaType.TEXT_XML)
public String webserviceRequest(@Context UriInfo uriInfo);
Run Code Online (Sandbox Code Playgroud) 我正在从DropWizard 0.7.1迁移到0.8.1.这包括从Jersey 1.x迁移到2.x. 在我使用Jersey 1.18.1的实现中,我实现了MyProvider
(为简单起见改变了所有类名)InjectableProvider
.该类将创建MyInjectable
包含自定义注入注释的对象MyToken
.MyToken
包含传递和读取的各种属性MyInjectable
.最后,在Application
类中我注册了一个新的实例MyProvider
,如下所示.
我做了一些研究,似乎无法解决我在泽西岛2.x中如何重新创建(或替代,我认为)这样一个场景.
这是当前的1.18.1实现:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.PARAMETER, ElementType.FIELD })
public @interface MyToken {
// Custom annotation containing various attributes
boolean someAttribute() default true;
// ...
}
public class MyProvider implements InjectableProvider<MyToken, Parameter> {
// io.dropwizard.auth.Authenticator
private final Authenticator<String, MyObject> authenticator;
public MyProvider(Authenticator<String, MyObject> authenticator) {
this.authenticator = authenticator;
}
@Override
public ComponentScope getScope() {
return ComponentScope.PerRequest;
}
@Override
public Injectable<?> getInjectable(ComponentContext …
Run Code Online (Sandbox Code Playgroud) 我正在使用Jersey和Tomcat的JAX-RS Web应用程序.获取请求很好但是当我尝试发布JSON时,我得到HTTP状态415 - 不支持的媒体类型.
这是我的简单HelloWorld.java:
package service;
import javax.ws.rs.*;
@Path("hello")
public class HelloWorld {
@GET
@Produces("text/plain")
public String get() {
return "hello world";
}
@POST
@Consumes("application/json")
public String post(JS input) {
return input.hello;
}
public static class JS {
public String hello;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在Postman中尝试的请求(带有'application/json'标题):
这是包含库的项目布局:
我在用:
谢谢!
我正在尝试使用额外的cookie对Server Sent Event资源进行单元测试.我已经在为客户端使用Jersey作为EventSource和JavaX.以下代码工作正常:
WebTarget target = ClientBuilder.newBuilder()
.register(SseFeature.class)
.build()
.target("http://localhost:8080/sse");
EventSource eventSource = EventSource.target(target).build();
EventListener listener = new EventListener() {
@Override
public void onEvent(InboundEvent inboundEvent) {
LOG.info(inboundEvent.readData(String.class));
}
};
eventSource.register(listener);
eventSource.open();
serverEventManager.send("/sse", "foo");
eventSource.close();
Run Code Online (Sandbox Code Playgroud)
Hoewever,对于额外的单元测试,我需要在请求中添加额外的cookie.我已经尝试了以下内容
target.(...).request.cookie("foo", "bar");
Run Code Online (Sandbox Code Playgroud)
但是这会返回一个构建器,我无法从中为EventSource创建所需的WebTarget.
我们有一场战争,通过基于hibernate-4.2.7验证的验证(实现validation-api-1.0.0.GA),在场地2.6上展示休息服务.
在我们升级到java 8和tc-server 3.1.X之前,一切正常.
升级到java 8之后,看起来在验证API中出现了问题.
我们得到了
java.lang.NoSuchMethodError:javax.validation.Configuration.getBootstrapConfiguration()Ljavax/validation/BootstrapConfiguration;
当我们从客户端发送休息请求时.
最奇怪的是,这种行为并不构成
当我从依赖项添加或删除jar时,它有时会起作用,有时候不起作用.
我们得到以下例外
SEVERE [tomcat-http--1] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [jerseyServlet] in context with path [/Analyzer] threw exception [A MultiException has 1 exceptions. They are:
1. java.lang.NoSuchMethodError: javax.validation.Configuration.getBootstrapConfiguration()Ljavax/validation/BootstrapConfiguration;
] with root cause
java.lang.NoSuchMethodError: javax.validation.Configuration.getBootstrapConfiguration()Ljavax/validation/BootstrapConfiguration;
at org.glassfish.jersey.server.validation.internal.ValidationBinder$ConfiguredValidatorProvider.getTraversableResolver(ValidationBinder.java:287)
at org.glassfish.jersey.server.validation.internal.ValidationBinder$ConfiguredValidatorProvider.getDefaultValidatorContext(ValidationBinder.java:268)
at org.glassfish.jersey.server.validation.internal.ValidationBinder$ConfiguredValidatorProvider.getDefaultValidator(ValidationBinder.java:248)
at org.glassfish.jersey.server.validation.internal.ValidationBinder$ConfiguredValidatorProvider.provide(ValidationBinder.java:199)
at org.glassfish.jersey.server.validation.internal.ValidationBinder$ConfiguredValidatorProvider.provide(ValidationBinder.java:173)
at org.jvnet.hk2.internal.FactoryCreator.create(FactoryCreator.java:96)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:456)
at org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:69)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2445)
at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:621)
at org.jvnet.hk2.internal.IterableProviderImpl.get(IterableProviderImpl.java:107)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:135)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$VoidOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:136)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:406)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:350)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:106)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:259)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) …
Run Code Online (Sandbox Code Playgroud) 目前我正在开发基于运动衫的RESTful应用程序,并希望在我的资源中使用DPI.(注意:jersey的版本是2.23.1,servlet容器是tomcat 8.5.3.)
因此,我遵循了球衣文档中的第23章自定义注入和生命周期管理教程,并创建了一个资源,一个工厂,并将工厂绑定到这样的类:
资源:
@Path("/{project}/catalogs")
public class ProjectsResource {
@Inject
Project project;
...
}
Run Code Online (Sandbox Code Playgroud)
厂:
public class ProjectFactory extends Factory<Project> {
private final Cache cache = cache.getInstance();
@PathParam("project")
private String project;
private HttpServletRequest request;
@Inject
public ProjectFactory(HttpServletRequest request) {
this.request = request;
}
@Override
public Project provide() {
return cache.get(project, Project.class);
}
@Override
public void dispose(Project instance) {}
}
Run Code Online (Sandbox Code Playgroud)
我还有一个功能,它注册一个AbstractBinder,它将我的ProjectFactory绑定到我的Project类.
@Provider
public class ProjectFeature implements Feature {
@Override
public boolean configure(FeatureContext context) {
context.register(new AbstractBinder() {
@Override
protected …
Run Code Online (Sandbox Code Playgroud) 我无法访问来自https://jersey.java.net/的球衣文档
球衣文件是否已移至新位置?
jersey-2.0 ×10
jersey ×8
java ×6
hk2 ×3
rest ×2
web-services ×2
asynchronous ×1
cookies ×1
dropwizard ×1
grizzly ×1
java-8 ×1
jax-rs ×1
jersey-1.0 ×1
json ×1
junit ×1
unit-testing ×1
validation ×1