我想让jersey使用可选参数。我有一个非常简单的web服务:
@Path("helloworld")
public static class HelloWorldResource {
public static final String CLICHED_MESSAGE = "Hello World!";
@GET
@Produces("text/plain")
public String getHello(@QueryParam("maybe") Optional<String> maybe) {
return CLICHED_MESSAGE;
}
}
还有一个简单的安全带:
public static void main(String[] arg) throws IOException {
ResourceConfig config = new ResourceConfig(HelloWorldResource.class);
String baseUri = "http://localhost:8080/api/";
HttpServer server = GrizzlyHttpServerFactory
.createHttpServer(URI.create(baseUri), config, false);
server.start();
}
但是,我得到以下错误:
Exception in thread "main" org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.
[[FATAL] No injection source found for a parameter of type public java.lang.String com.mercuria.odyssey.server.GrizllyOptional$HelloWorldResource.getHello(java.util.Optional) at index 0.; source='ResourceMethod{httpMethod=GET, consumedTypes=[], producedTypes=[text/plain], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class com.mercuria.odyssey.server.GrizllyOptional$HelloWorldResource, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@a3d9978]}, definitionMethod=public java.lang.String com.mercuria.odyssey.server.GrizllyOptional$HelloWorldResource.getHello(java.util.Optional), parameters=[Parameter [type=class java.util.Optional, source=maybe, defaultValue=null]], responseType=class java.lang.String}, nameBindings=[]}']
at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:555)
at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:184)
at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:350)
at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:347)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:255)
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:347)
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:311)
at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.<init>(GrizzlyHttpContainer.java:337)
at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory.createHttpServer(GrizzlyHttpServerFactory.java:140)
at com.mercuria.odyssey.server.GrizllyOptional.main(GrizllyOptional.java:33)
我想我需要做点什么让泽西知道怎么处理 Optional
参数,但我不知道是什么!
2条答案
按热度按时间rfbsl7qr1#
所以允许作为
@Param
,您需要满足以下要求之一:是基元类型
有一个接受单个字符串参数的构造函数
有一个名为
valueOf()
或者fromString()
接受单个字符串参数的,Integer.valueOf(String)
)注册实施
ParamConverterProvider
返回ParamConverter
示例能够对类型进行“from string”转换。是
List<T>
,Set<T>
或者SortedSet<T>
,在哪里T
满足上述2、3或4。生成的集合是只读的。所以在这种情况下
Optional
,从名单上往下看;它不是原始的;它没有字符串构造函数;它没有静电干扰valueOf()
或者fromString()
所以基本上,剩下的唯一选择就是实现ParamConverter
/ParamConverterProvider
为它配对。dropwizard(一个构建在jersey之上的框架)有一个很好的实现。我会把它贴在这里,以防链接死掉注意,如果您使用的是jersey版本2.26+,而不是注入
ServiceLocator
您将使用InjectionManager
相反。也就是接受locator
,则需要更改经理。对于这个类,您只需要在jersey应用程序中注册它。
carvr3hs2#
这是一个部分解决方案,但dropwizard似乎有一个专门支持此功能的功能:
https://github.com/dropwizard/dropwizard/blob/master/dropwizard-jersey/src/main/java/io/dropwizard/jersey/optional/optionalparambinder.java
所以你可以简单地使用他们的代码:
再加上: