我遇到了一个问题,我的可部署jar遇到了一个异常,当我在IntelliJ中本地运行时,这个异常不会发生.
例外:
Receiving an event {id=2, socket=0c317829-69bf-43d6-b598-7c0c550635bb, type=getDashboard, data={workstationUuid=ddec1caa-a97f-4922-833f-632da07ffc11}, reply=true}
Firing getDashboard event to Socket#0c317829-69bf-43d6-b598-7c0c550635bb
Failed invoking AtmosphereFramework.doCometSupport()
java.lang.IllegalArgumentException: Can not deserialize instance of java.lang.String out of START_OBJECT token
at [Source: N/A; line: -1, column: -1]
at org.codehaus.jackson.map.ObjectMapper._convert(ObjectMapper.java:2502)
at org.codehaus.jackson.map.ObjectMapper.convertValue(ObjectMapper.java:2468)
at com.github.flowersinthesand.portal.support.DefaultDispatcher$DefaultHandler$DataParam.resolve(DefaultDispatcher.java:270)
at com.github.flowersinthesand.portal.support.DefaultDispatcher$DefaultHandler.handle(DefaultDispatcher.java:204)
at com.github.flowersinthesand.portal.support.DefaultDispatcher.fire(DefaultDispatcher.java:107)
at com.github.flowersinthesand.portal.support.AbstractSocketFactory.fire(AbstractSocketFactory.java:73)
at com.github.flowersinthesand.portal.atmosphere.AtmosphereSocketFactory.onRequest(AtmosphereSocketFactory.java:75)
at org.atmosphere.cpr.AsynchronousProcessor.action(AsynchronousProcessor.java:256)
at org.atmosphere.cpr.AsynchronousProcessor.suspended(AsynchronousProcessor.java:166)
at org.atmosphere.container.Grizzly2WebSocketSupport.service(Grizzly2WebSocketSupport.java:75)
at org.atmosphere.cpr.AtmosphereFramework.doCometSupport(AtmosphereFramework.java:1342)
at org.atmosphere.websocket.DefaultWebSocketProcessor.dispatch(DefaultWebSocketProcessor.java:219)
at org.atmosphere.websocket.DefaultWebSocketProcessor$2.run(DefaultWebSocketProcessor.java:183)
at org.atmosphere.util.VoidExecutorService.execute(VoidExecutorService.java:101)
at org.atmosphere.websocket.DefaultWebSocketProcessor.dispatch(DefaultWebSocketProcessor.java:178)
at org.atmosphere.websocket.DefaultWebSocketProcessor.invokeWebSocketProtocol(DefaultWebSocketProcessor.java:167)
at org.atmosphere.container.Grizzly2WebSocketSupport$Grizzly2WebSocketApplication.onMessage(Grizzly2WebSocketSupport.java:171)
at org.glassfish.grizzly.websockets.DefaultWebSocket.onMessage(DefaultWebSocket.java:164)
at org.glassfish.grizzly.websockets.frametypes.TextFrameType.respond(TextFrameType.java:70)
at org.glassfish.grizzly.websockets.DataFrame.respond(DataFrame.java:104)
at org.glassfish.grizzly.websockets.WebSocketFilter.handleRead(WebSocketFilter.java:221)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) …
Run Code Online (Sandbox Code Playgroud) 我正在基于一个示例编写一个托管在Heroku上的Java RESTful服务 - > https://api.heroku.com/myapps/template-java-jaxrs/clone
我的样品服务是:
package com.example.services;
import com.example.models.Time;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/time")
@Produces(MediaType.APPLICATION_JSON)
public class TimeService {
@GET
public Time get() {
return new Time();
}
}
Run Code Online (Sandbox Code Playgroud)
我的主要是:
public class Main {
public static final String BASE_URI = getBaseURI();
/**
* @param args
*/
public static void main(String[] args) throws Exception{
final Map<String, String> initParams = new HashMap<String, String>();
initParams.put("com.sun.jersey.config.property.packages","services.contracts");
System.out.println("Starting grizzly...");
SelectorThread threadSelector = GrizzlyWebContainerFactory.create(BASE_URI, initParams);
System.out.println(String.format("Jersey started with WADL available at …
Run Code Online (Sandbox Code Playgroud) 我们的前端是简单的Jetty(稍后可能会被Tomcat替换)服务器.通过servlet,我们提供了一个公共HTTP API(或多或少RESTful)来公开我们的产品功能.
在后端,我们有一个Java进程,它可以执行多种维护任务.虽然后端进程通常会在有时间的情况下执行自己的任务,但是前端需要唤醒后端以在后台执行某项任务.
哪个(N)IO库是这项任务的理想选择?我找到了Netty,Grizzly,kryonet和普通的RMI.现在,我倾向于说Netty,它似乎很简单,它可能非常可靠.
你们有没有这种设置的经验?你会选择什么?
谢谢!
我正在尝试为我的restful服务创建一个自定义的http param绑定.请参阅下面的示例.
@POST
@Path("/user/{userId}/orders")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public MyResult foo(@PathParam("userId") String someString, @UserAuthHeaderParam String authString){
}
Run Code Online (Sandbox Code Playgroud)
您可以看到函数签名中有UserAuthHeaderParam注释.我想要做的是有一个自定义的http param绑定,而不是标准的javax.ws.rs.*Param.
我试图实现org.glassfish.hk2.api.InjectionResolver,它基本上从http头中提取值:
public class ProtoInjectionResolver implements InjectionResolver<UserAuthHeaderParam>{
...
@Override
public Object resolve(Injectee injectee, ServiceHandle< ? > root)
{
return "Hello World";
}
...
}
Run Code Online (Sandbox Code Playgroud)
当我调用restful服务时,服务器会遇到异常.它表明框架无法解析函数签名中的参数:
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=String,parent=MyResource,qualifiers={}),position=0,optional=false,self=false,unqualified=null,2136594195),
java.lang.IllegalArgumentException: While attempting to resolve the dependencies of rs.server.MyResource errors were found
Run Code Online (Sandbox Code Playgroud)
请帮忙.任何建议表示赞赏.我在谷歌上做了很多搜索,但未能使它工作.泽西岛2.*.如何替换Jersey 1.*的InjectableProvider和AbstractHttpContextInjectable可能是类似的问题.
- 更新:我使用AbstractBinder将我的解析器绑定到UserAuthHeaderParam:
public class MyApplication extends ResourceConfig
{
public MyApplication()
{
register(new AbstractBinder() …
Run Code Online (Sandbox Code Playgroud) 有没有办法在使用WebSockets(Tyrus)时指定本地IP地址和端口?
我正在寻找与Socket的完整4参数构造函数相同的功能
编辑:
我发现低级Grizzly TCPNIOTransport确实有一个带本地地址的connect()方法,但我不知道如何让Tyrus客户端使用它.
我有一个基于Jersey的Java servlet:
@Path("foo")
class Foo {
@GET
@Path("bar")
public Response bar(@QueryParam("key") String value) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在Tomcat中称它为:
http://localhost:8080/container/foo/bar?key=blah
Run Code Online (Sandbox Code Playgroud)
但是,在我的JerseyTest中,使用Grizzly,它没有正确处理参数.此测试用例返回404错误:
@Test
public void testBar() {
final Response response = target("foo/bar?key=blah").request().get();
}
Run Code Online (Sandbox Code Playgroud)
我怀疑问题是它正在寻找一个名为资源foo/bar?key=blah
而不是试图传递key=blah
给资源的资源foo/bar
.如果我只是传递"foo/bar"
给target()
,我得到一个500,因为代码抛出一个null参数的异常.
我查看了Jersey测试文档,以及一些示例,我发现了一些可能用于将参数传递给GET的神秘内容,但没有一个看起来像是为参数赋值,所以我并不积极如何我会用它.
如何将该值传递给该参数?
我正在尝试使用Grizzly创建一个服务器来运行我使用Jersey开发的REST服务.我使用以下方法创建Grizzly服务器:
final String baseUri = "http://localhost:9998/";
final Map<String, String> initParams = new HashMap<String, String>();
initParams.put("com.sun.jersey.config.property.packages", "me.my.rest.package");
SelectorThread threadSelector =
GrizzlyWebContainerFactory.create(baseUri, initParams);
Run Code Online (Sandbox Code Playgroud)
正如我发现的所有例子似乎都暗示的那样.这很好,服务器启动并能够将传入的请求转发到我的资源类.
但是,服务实现要求它使用servlet过滤器.似乎Grizzly通过ServletAdapter
类支持过滤器的定义和其他类似的servlet相关配置选项.我的问题是,在使用com.sun.jersey.api.container.grizzly.GrizzlyWebContainerFactory
提供Jersey集成的时,我无法弄清楚如何定义过滤器.
有任何想法吗?
我可以用灰熊开始并用以下几行在其上部署Jersey webservices.
protected HttpServer create() throws Throwable {
ResourceConfig rc = new PackagesResourceConfig("com.resource", "com.provider");
HttpServer server = GrizzlyServerFactory.createHttpServer(uri, rc);
return server;
}
Run Code Online (Sandbox Code Playgroud)
但有没有办法加载web.xml
而不是ResourceConfig
?
<web-app>
<servlet>
<servlet-name>Jersey</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.resource, com.provider</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Jersey</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud) 如何允许CDI将资源注入到宁静的Web服务资源中?我使用焊接2(cdi),泽西(jaxrs)和灰熊(网络服务器)在标准java上运行.这是我简单的网络资源:
import training.student.StudentRepository;
import javax.inject.Inject;
import javax.ws.rs.*;
@Path("student")
public class StudentWebResource {
@Inject
private StudentRepository studentRepository;
@GET
@Path("count")
@Produces(MediaType.TEXT_PLAIN)
public Integer getCount() {
return studentRepository.studentCount();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我如何焊接启动我的简单Web服务器:
public class Main {
public static void main(String[] args) throws Exception {
startCdiApplication();
}
public static void startCdiApplication() throws Exception {
Weld weld = new Weld();
try {
WeldContainer container = weld.initialize();
Application application = container.instance().select(WebServer.class).get();
application.run();
}
finally {
weld.shutdown();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我怀疑的代码需要修改,以通知球衣使用焊接CDI注入分辨率:
...
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.jackson.JacksonFeature; …
Run Code Online (Sandbox Code Playgroud) 我有一个Jersey REST 2.5.1服务,通过Grizzly服务器提供服务.到目前为止一切正常.我想添加一些静态内容,这些内容也通过Grizzly提供,并从我的JAR文件中提供.所以我用CLStaticHttpHandler
.当我访问静态资源时,例如我的index.html
显式(例如http://localhost:8080/index.html
),一切正常.但是,当我尝试访问root时http://localhost:8080
,我得到一个404.代码如下所示:
ObjectMapper mapper = new ObjectMapper();
// some configuration stuff here
JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
provider.setMapper(mapper);
ResourceConfig resourceConfig = new ResourceConfig()
.packages("my.restapi.package")
.register(provider);
HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), resourceConfig);
HttpHandler httpHandler = new CLStaticHttpHandler(HttpServer.class.getClassLoader(), "/static/");
httpServer.getServerConfiguration().addHttpHandler(httpHandler, "/");
Run Code Online (Sandbox Code Playgroud)
据我所知,从调试开始,org.glassfish.grizzly.http.server.CLStaticHttpHandler.handle(String, Request, Response)
永远不会被调用.任何提示,我如何使index.html
可访问的默认页面?