Java 让独立Grizzly2JAX-RS接受URL中的编码URL?

Java 让独立Grizzly2JAX-RS接受URL中的编码URL?,java,rest,jax-rs,grizzly,Java,Rest,Jax Rs,Grizzly,我正在尝试将一个可能泄漏的库封装在它自己的独立JVM中,并使用REST调用它。我有一个JavaEE7Web应用程序可以做到这一点,但我想要一个独立的版本。为此,我使用 mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes \ -DarchetypeArtifactId=jersey-quickstart-grizzly2 -DarchetypeVersion=2.27 这给了我一个小项目与这个主要

我正在尝试将一个可能泄漏的库封装在它自己的独立JVM中,并使用REST调用它。我有一个JavaEE7Web应用程序可以做到这一点,但我想要一个独立的版本。为此,我使用

mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes \
 -DarchetypeArtifactId=jersey-quickstart-grizzly2 -DarchetypeVersion=2.27
这给了我一个小项目与这个主要

public class Main {
    // Base URI the Grizzly HTTP server will listen on
    public static final String BASE_URI = "http://localhost:8080/verapdf/";

    /**
     * Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.
     * @return Grizzly HTTP server.
     */
    public static HttpServer startServer() {
        // create a resource config that scans for JAX-RS resources and providers
        // in dk.kb.dpa.verapdf package
        final ResourceConfig rc = new ResourceConfig().packages("dk.kb.dpa.verapdf");

        // create and start a new instance of grizzly http server
        // exposing the Jersey application at BASE_URI
        return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
    }

    /**
     * Main method.
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        final HttpServer server = startServer();
        System.out.println(String.format("Jersey app started with WADL available at "
                + "%sapplication.wadl\nHit enter to stop it...", BASE_URI));
        System.in.read();
        server.stop();
    }
}
我添加了自己的小型资源,如下所示:

.
.
.
@Path("validate")
public class JAXRSValidator {

    @GET
    @Path("{url}")
    @Produces(MediaType.APPLICATION_XML)
    public String validate(@PathParam("url") String url) throws Exception 
.
.
.
到目前为止,我可以调用
http://localhost:8080/verapdf/validate/123
并点击方法内部的断点,将
url
设置为
123
。一、 但是,如果您希望在这里有一个真实的URL(它将是绝对的,并且包含斜杠和哈希标记),这将给出一个错误500。由于没有调用该方法,我怀疑web容器和/或JAX-RS不喜欢我在正确位置的编码URL,就像Tomcat看起来所做的那样


我如何解决这个问题?另一种方法很好,只要我最终得到一个独立的二进制文件来提供REST服务。

正如在评论中提到的,斜杠解码有问题。可以显式启用斜杠解码:

public static HttpServer startServer() {
    final ResourceConfig rc = new ResourceConfig().packages("dk.kb.dpa.verapdf");
    HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
    httpServer.getHttpHandler().setAllowEncodedSlash(true);
    return httpServer;
}
如果没有
AllowEncodedDSLASH
HTTP服务器在解码编码斜杠时抛出并捕获内部异常。默认情况下,禁止斜杠解码:

java.io.CharConversionException: Encoded slashes are not allowed
    at org.glassfish.grizzly.http.util.URLDecoder.decode(URLDecoder.java:251)
    at org.glassfish.grizzly.http.util.URLDecoder.decodeAscii(URLDecoder.java:159)
    at org.glassfish.grizzly.http.util.URLDecoder.decode(URLDecoder.java:71)
    at org.glassfish.grizzly.http.util.HttpRequestURIDecoder.decode(HttpRequestURIDecoder.java:161)
    at org.glassfish.grizzly.http.util.RequestURIRef.getDecodedRequestURIBC(RequestURIRef.java:138)
    at org.glassfish.grizzly.http.util.RequestURIRef.getDecodedRequestURIBC(RequestURIRef.java:124)
    at org.glassfish.grizzly.http.server.HttpHandlerChain.doHandle(HttpHandlerChain.java:203)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:242)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.SameThreadIOStrategy.executeIoEvent(SameThreadIOStrategy.java:103)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.executeIoEvent(AbstractIOStrategy.java:89)
    at org.glassfish.grizzly.nio.SelectorRunner.iterateKeyEvents(SelectorRunner.java:427)
    at org.glassfish.grizzly.nio.SelectorRunner.iterateKeys(SelectorRunner.java:396)
    at org.glassfish.grizzly.nio.SelectorRunner.doSelect(SelectorRunner.java:358)
    at org.glassfish.grizzly.nio.SelectorRunner.run(SelectorRunner.java:281)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:593)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:573)
    at java.lang.Thread.run(Thread.java:745)
java.io.CharConversionException: Encoded slashes are not allowed
    at org.glassfish.grizzly.http.util.URLDecoder.decode(URLDecoder.java:251)
    at org.glassfish.grizzly.http.util.URLDecoder.decodeAscii(URLDecoder.java:159)
    at org.glassfish.grizzly.http.util.URLDecoder.decode(URLDecoder.java:71)
    at org.glassfish.grizzly.http.util.HttpRequestURIDecoder.decode(HttpRequestURIDecoder.java:161)
    at org.glassfish.grizzly.http.util.RequestURIRef.getDecodedRequestURIBC(RequestURIRef.java:138)
    at org.glassfish.grizzly.http.util.RequestURIRef.getDecodedRequestURIBC(RequestURIRef.java:124)
    at org.glassfish.grizzly.http.server.HttpHandlerChain.doHandle(HttpHandlerChain.java:203)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:242)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.SameThreadIOStrategy.executeIoEvent(SameThreadIOStrategy.java:103)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.executeIoEvent(AbstractIOStrategy.java:89)
    at org.glassfish.grizzly.nio.SelectorRunner.iterateKeyEvents(SelectorRunner.java:427)
    at org.glassfish.grizzly.nio.SelectorRunner.iterateKeys(SelectorRunner.java:396)
    at org.glassfish.grizzly.nio.SelectorRunner.doSelect(SelectorRunner.java:358)
    at org.glassfish.grizzly.nio.SelectorRunner.run(SelectorRunner.java:281)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:593)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:573)
    at java.lang.Thread.run(Thread.java:745)

我相信ALLOW_ENCODED_SLASH有问题。请阅读,也许它有帮助:决定将其移动到查询参数,而不必处理每个容器。