我正在尝试设置一个玩具应用程序(有一天可能会转向真正的应用程序).我遇到了Wink和Jackson的问题.我有两个应用程序:一个在jetty上运行wink-server,似乎提供了一些JSON数据就好了; 一个在jetty上运行wink-client并且接收JSON数据就好了.问题在于将JSON数据自动反序列化回我的Java bean.
这是我在wink客户端操作中使用的代码:
RestClient client = new RestClient();
Resource resource = client.resource("http://localhost:8081/helloworld");
User user = resource.accept(MediaType.APPLICATION_JSON).get(User.class);
Run Code Online (Sandbox Code Playgroud)
这是我尝试运行Struts操作时收到的错误:
java.lang.RuntimeException: No javax.ws.rs.ext.MessageBodyReader found for type class my.package.structure.User and media type application/json. Verify that all entity providers are correctly registered.
org.apache.wink.client.internal.handlers.ClientResponseImpl.readEntity(ClientResponseImpl.java:123)
org.apache.wink.client.internal.handlers.ClientResponseImpl.getEntity(ClientResponseImpl.java:65)
org.apache.wink.client.internal.handlers.ClientResponseImpl.getEntity(ClientResponseImpl.java:52)
org.apache.wink.client.internal.ResourceImpl.invoke(ResourceImpl.java:186)
org.apache.wink.client.internal.ResourceImpl.get(ResourceImpl.java:294)
my.package.structure.action.HelloWorldAction.execute(HelloWorldAction.java:29)
...
Run Code Online (Sandbox Code Playgroud)
如果我用下面的代码替换第一个代码片段中的最后一行,一切都运行正常,花花公子.
String message = resource.accept(MediaType.APPLICATION_JSON).get(String.class);
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(message, User.class);
Run Code Online (Sandbox Code Playgroud)
很明显,数据很好,但问题似乎在于JacksonJsonProvider类没有在Wink客户端注册.我已经看到很多方法用Wink服务器注册提供程序,但不是Wink客户端.
是否可以使第一个代码段正常运行?如果是这样,怎么样?
(顺便说一句,另一个问题可能是我在我的User类上缺少注释.现在没有任何注释.也许我需要一些......)
我正在尝试部署使用jersey的jax-rs客户端应用程序是8.5.
我希望我不需要在战争中包装球衣罐,因为它会提供给他们.
但是在尝试调用我的servlet时遇到了这个错误:
错误404:javax.servlet.UnavailableException:SRVE0203E:Servlet [HelloJAXRSClient]:找到了example.HelloJAXRSClient,但缺少另一个必需的类.SRVE0206E:此错误通常意味着servlet最初使用服务器无法定位的类进行编译.SRVE0187E:检查类路径以确保servlet所需的所有类都存在.SRVE0210I:可以通过仅使用应用程序运行时中的类重新编译servlet来调试此问题
有什么我可以使用的是库,所以我不需要将它们打包到我的应用程序中?
从我的JAX-RS(Jersey)资源内部,我需要获取Jersey Servlet"发布"该资源的基本URL .我ServletContext按照这里描述尝试注射,然后执行:
return servletContext.getResource("/").toString();
Run Code Online (Sandbox Code Playgroud)
获取Servlet此资源的Jersey的"基本"URL .
但是,上面的代码返回一个值,如:
jndi:/localhost/jax-rs-tomcat-test/
Run Code Online (Sandbox Code Playgroud)
我期待更多的东西:
http://localhost:8080/jax-rs-tomcat-test/jax-rs
Run Code Online (Sandbox Code Playgroud)
" jax-rs"是我在web.xml中的位置:
<servlet-mapping>
<servlet-name>jersey-servlet</servlet-name>
<url-pattern>/jax-rs/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
也就是说,存在四个"差异":(a)协议,(b)协议之后的单个而不是双斜杠,(c)端口号和(d)用于触发Jersey servlet的URL模式缺失.那么,我该怎么做:
http://Jersey servlet 的基本URL@GET或带@POST注释方法的完整URL ?我试图java webservices并尝试遵循几个教程示例.
在其中一个示例中,我看到@Produces注释用于指定要返回的响应类型.
例:
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello() {
return "Hello Jersey";
}
Run Code Online (Sandbox Code Playgroud)
但在另一种情况下,我看到Response对象被用作响应...
例:
@GET
@Path("/{param}")
public Response getMsg(@PathParam("param") String msg) {
String output = "Jersey say : " + msg;
return Response.status(200).entity(output).build();
}
Run Code Online (Sandbox Code Playgroud)
题:
在我的jax-rs上使用hibernate我收到此错误:
HTTP错误500
访问/ services/datesTest时遇到问题.原因:
Run Code Online (Sandbox Code Playgroud)Server Error Caused by:connector.Connector.getSessionFactory(Connector.java:37)上的connectors.Connector.getSessionFactory(Connector.java:37)中的连接器.Connector.getSession(Connector.java:37)位于mainproject.services.HibernateDatesTest的连接器上的java.lang.ExceptionInInitializerError .verifyToken(HibernateDatesTest.java:24)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43 )在com.sun.jersey.server.impl的com.sun.jersey.spi.container.JavaMethodInvokerFactory $ 1.invoke(JavaMethodInvokerFactory.java:60)的java.lang.reflect.Method.invoke(Method.java:606) .model.method.dispatch.AbstractResourceMethodDispatchProvider $ TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)at com.sun .jersey.serve 在com.sun.jersey的com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)上的r.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288). server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)位于com.sun.jersey的com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84). server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)位于com.sun.jersey.server.impl的com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400). application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349),位于com.sun.jersey.spi.container.servlet.WebComponent的com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339).服务(WebComponent.java:416)com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)at com.sun.jersey.spi.container.servlet.ServletC ontainer.service(ServletContainer.java:699)位于org.eclipse的org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:565)的javax.servlet.http.HttpServlet.service(HttpServlet.java:820) .jetty.servlet.ServletHandler.doHandle(ServletHandler.java:479)在org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)在org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler .java:521)org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227)位于org的org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1031). eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:406)位于org.eclipse.jetty.server.hand.ContextHandler的org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186). dogcope(ContextHandler.java:965)atg.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)org.eclipse.jet.Server.handle(Server.java:349)org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:449)org.eclipse.jetty.server.AbstractHttpConnection $ RequestHandler .headerComplete(AbstractHttpConnection.java:910)在org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:634)在org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)在有机在org.eclipse.jetty.io.nle.SelectChannelEndPoint $ 1的org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:609)的eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:76) .RUN(SelectChannelEndPoint.java:45)在org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:599)在org.eclipse.jetty.util.thread.QueuedThreadPool $ 3.run(QueuedThreadPool.java: 534)at java.lang.Thread.run(Thread.java:744)引起:java.lang.NoSuchMethodError:org.hibernate.integrator.internal.IntegratorServiceImpl.(Ljava/util/LinkedHashSe)t; Lorg/hibernate/boot/registry/classloading/spi/ClassLoaderService;)V org.hibernate.boot.registry.BootstrapServiceRegistryBuilder.build(BootstrapServiceRegistryBuilder.java:247)at org.hibernate.boot.registry.StandardServiceRegistryBuilder.(StandardServiceRegistryBuilder .java:73)在connectors.Connector.buildSessionFactory(Connector.java:21)... 44更多引起:
.java.lang.NoSuchMethodError:org.hibernate.integrator.internal.IntegratorServiceImpl(Ljava/UTIL/LinkedHashSet; Lorg /休眠/引导/注册表/类装入/ SPI/ClassLoaderService)在org.hibernate.boot.registry.BootstrapServiceRegistryBuilder诉org.hibernate.boot.registry.StandardServiceRegistryBuilder中构建(BootstrapServiceRegistryBuilder.java:247).在connectors.Connector.getSessionFactory(Connector.java:21)上的connectors.Connector.buildSessionFactory(Connector.java:21). 37)在sun.reflect.NativeMethodAccessorImpl.invoke的sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)的mainproject.services.HibernateDatesTest.verifyToken(HibernateDatesTest.java:24)的connectors.Connector.getSession(Connector.java:45)处. (NativeMethodAccessorImpl.java:57)位于com.sun.jersey.spi.container的java.lang.reflect.Method.invoke(Method.java:606)的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43). JavaMethodInvokerFactory $ 1.in voke(JavaMethodInvokerFactory.java:60)at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider $ TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)at com.sun.jersey.server.impl.model.在com.sun.jersey.server.impl的com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)上的method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75). uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)位于com.sun.jersey.server.impl的com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147). uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)位于com.sun.jersey.server.impl.application的com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469). WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebA pplicationImpl.java:1349)com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java: 416)at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)at javax .servlet.http.HttpServlet.service(HttpServlet.java:820)atg.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:565)org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java) :479)org.eclipse.jetty上的org.eclipse.jetty.SecurityHandler.handle(SecurityHandler.java:521)的org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119). server.session.SessionHandler.doHandle(SessionHandler.java:227)位于org.eclipse.jetty.servlet.servlet.servlet.ServletHandler.doScope的org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1031)rvletHandler.java:406)org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186)org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:965)at org位于org.eclipse.jetty.server.Server的org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)的.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) .handle(Server.java:349)在org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:449)在org.eclipse.jetty.server.AbstractHttpConnection $ RequestHandler.headerComplete(AbstractHttpConnection.java:910)在org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:634)在org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)在org.eclipse.jetty.server.AsyncHttpConnection.handle( AsyncHttpConnection.java:76)atg.eclipse.jetty.io.nle.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:609)org.eclipse.jetty.io.nio.SelectChannelEndPoint $ …
我正在编写一个日志记录过滤器,记录在Jersey中运行的Web应用程序的所有HTTP请求/响应.ContainerResponseFilter似乎是一个直接的解决方案,我已设法让它工作.
下一步是记录请求的IP.有没有办法从里面做到这一点ContainerResponseFilter?
我知道默认情况下,JAX-RS端点的生命周期是每个请求一次,因此可以将请求特定的信息注入实例中。
我们还可以使端点Singleton表示每个应用一次,在该端点中,不能将请求特定的信息注入实例,而可以将其注入请求的方法。
1.因此,我想知道哪种方法在性能方面更好,无论是每个请求一次还是每个应用程序一次。
2.我还想了解这些方法的优缺点,以及注射要求的特定信息
3.您希望在API应用程序中使用哪种方法
注意:到目前为止,我一直在使用“每次请求一次”的方法,但是我一直想知道这是有效的,肯定是它使编码更容易且可重复使用。
将corsfilter添加到ApplicationPath后,我无法访问任何服务
这是一个例子
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import org.jboss.resteasy.plugins.interceptors.CorsFilter;
@ApplicationPath("/")
public class JaxRsActivator extends Application {
private Set<Object> singletons = new HashSet<Object>();
private Set<Class<?>> classes = new HashSet<Class<?>>();
public JaxRsActivator() {
CorsFilter corsFilter = new CorsFilter();
corsFilter.getAllowedOrigins().add("*");
corsFilter.setAllowedHeaders("Content-Type");
singletons.add(corsFilter);
}
@Override
public Set<Class<?>> getClasses() {
return classes;
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我卷曲,我会得到这个,
curl -i http://localhost:8080/unika/usuarios -H "Origin:otherdomain.com"
HTTP/1.1 404 Not Found
Connection: keep-alive
Access-Control-Allow-Origin: otherdomain.com
X-Powered-By: Undertow 1
Server: Wildfly 8 …Run Code Online (Sandbox Code Playgroud) 我应该如何/应该将一个对象从ContainerRequestFilter传递给(JAX-RS)Resteasy版本3.0.11中的(后匹配)资源,该版本已嵌入并使用Guice?
我正在开发基于Jersey REST API的Web应用程序.我正在根据客户端要求(JSON格式的输入参数)开发POST服务,并且工作正常.现在他们想要改变输入格式,如下所示.现在我得到415错误(不支持的媒体类型).
这是旧的JSON格式,它的效果很好:
{
"weight": 5.0,
"length": 1.5,
"width": 2.7,
"height": 0.7
}
Run Code Online (Sandbox Code Playgroud)
这个格式客户端需要发送.
{
weight = 12;
with = 78;
height = 78;
length = 5;
}
Run Code Online (Sandbox Code Playgroud)
这是我的POST服务:
@POST
@Path("/insert")
@Consumes({MediaType.TEXT_PLAIN})
@Produces({MediaType.APPLICATION_JSON})
Run Code Online (Sandbox Code Playgroud)
以前我用过
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
Run Code Online (Sandbox Code Playgroud)