jersey访问路径是如何匹配并访问的(一)

上周同事遇到了一个问题,就是明明路径存在,但是却报出404未找到路径,但是不是所有的路径都404,网上查了很多关于jersey的资料,好像也没说全,这次就自己查看一下源码,看看它到底是怎么去匹配的。

举一个例子:

http:127.0.0.1:8080/dsj/dsjql/v1/UnittypeCount/getList能访问成功;

http:127.0.0.1:8080/dsj/dsjql/v1/bmsx/areacode访问404。

这里说一个题外话,就是一开始的思考路线错了,往网络方面那边走了,导致浪费了点时间。需要知道jersey怎么匹配的,那么首先要知道它是怎么初始化并加载的。

因为我们公司平台把jersey和spring整合了,那么先看入口类ResteasyDeployment的start方法吧。

public void start()
    {
        Map contextDataMap;
        if(providerFactory == null)
            providerFactory = new ResteasyProviderFactory();
        providerFactory.setRegisterBuiltins(registerBuiltin);
        if(deploymentSensitiveFactoryEnabled)
        {
            if(!(providerFactory instanceof ThreadLocalResteasyProviderFactory) && (ResteasyProviderFactory.peekInstance() == null || !(ResteasyProviderFactory.peekInstance() instanceof ThreadLocalResteasyProviderFactory)))
            {
                threadLocalProviderFactory = new ThreadLocalResteasyProviderFactory(providerFactory);
                ResteasyProviderFactory.setInstance(threadLocalProviderFactory);
            }
        } else
        {
            ResteasyProviderFactory.setInstance(providerFactory);
        }
        if(asyncJobServiceEnabled)
        {
            AsynchronousDispatcher asyncDispatcher = new AsynchronousDispatcher(providerFactory);
            asyncDispatcher.setMaxCacheSize(asyncJobServiceMaxJobResults);
            asyncDispatcher.setMaxWaitMilliSeconds(asyncJobServiceMaxWait);
            asyncDispatcher.setThreadPoolSize(asyncJobServiceThreadPoolSize);
            asyncDispatcher.setBasePath(asyncJobServiceBasePath);
            asyncDispatcher.getUnwrappedExceptions().addAll(unwrappedExceptions);
            dispatcher = asyncDispatcher;
            asyncDispatcher.start();
        } else
        if(dispatcher == null)
        {
            SynchronousDispatcher dis = new SynchronousDispatcher(providerFactory);
            dis.getUnwrappedExceptions().addAll(unwrappedExceptions);
            dispatcher = dis;
        }
        registry = dispatcher.getRegistry();
        if(widerRequestMatching)
            ((ResourceMethodRegistry)registry).setWiderMatching(widerRequestMatching);
        dispatcher.getDefaultContextObjects().putAll(defaultContextObjects);
        dispatcher.getDefaultContextObjects().put(javax/ws/rs/core/Configurable, providerFactory);
        dispatcher.getDefaultContextObjects().put(javax/ws/rs/core/Configuration, providerFactory);
        dispatcher.getDefaultContextObjects().put(javax/ws/rs/ext/Providers, providerFactory);
        dispatcher.getDefaultContextObjects().put(org/jboss/resteasy/spi/Registry, registry);
        dispatcher.getDefaultContextObjects().put(org/jboss/resteasy/core/Dispatcher, dispatcher);
        dispatcher.getDefaultContextObjects().put(org/jboss/resteasy/spi/InternalDispatcher, InternalDispatcher.getInstance());
        contextDataMap = ResteasyProviderFactory.getContextDataMap();
        contextDataMap.putAll(dispatcher.getDefaultContextObjects());
        if(injectorFactoryClass != null)
        {
            InjectorFactory injectorFactory;
            try
            {
                Class clazz = Thread.currentThread().getContextClassLoader().loadClass(injectorFactoryClass);
                injectorFactory = (InjectorFactory)clazz.newInstance();
            }
            catch(ClassNotFoundException cnfe)
            {
                throw new RuntimeException(Messages.MESSAGES.unableToFindInjectorFactory(), cnfe);
            }
            catch(Exception e)
            {
                throw new RuntimeException(Messages.MESSAGES.unableToInstantiateInjectorFactory(), e);
            }
            providerFactory.setInjectorFactory(injectorFactory);
        }
        if(constructedDefaultContextObjects != null && constructedDefaultContextObjects.size() > 0)
        {
            Class key;
            Object obj;
            for(Iterator iterator = constructedDefaultContextObjects.entrySet().iterator(); iterator.hasNext(); contextDataMap.put(key, obj))
            {
                java.util.Map.Entry entry = (java.util.Map.Entry)iterator.next();
                key = null;
                try
                {
                    key = Thread.currentThread().getContextClassLoader().loadClass((String)entry.getKey());
                }
                catch(ClassNotFoundException e)
                {
                    throw new RuntimeException(Messages.MESSAGES.unableToInstantiateContextObject((String)entry.getKey()), e);
                }
                obj = createFromInjectorFactory((String)entry.getValue(), providerFactory);
                LogMessages.LOGGER.creatingContextObject((String)entry.getKey(), (String)entry.getValue());
                defaultContextObjects.put(key, obj);
                dispatcher.getDefaultContextObjects().put(key, obj);
            }

        }
        if(interceptorPrecedences != null)
        {
            String precedence;
            for(Iterator iterator1 = interceptorPrecedences.iterator(); iterator1.hasNext(); providerFactory.appendInterceptorPrecedence(precedence.trim()))
                precedence = (String)iterator1.next();

        }
        if(interceptorBeforePrecedences != null)
        {
            java.util.Map.Entry ext;
            for(Iterator iterator2 = interceptorBeforePrecedences.entrySet().iterator(); iterator2.hasNext(); providerFactory.insertInterceptorPrecedenceBefore(((String)ext.getKey()).trim(), ((String)ext.getValue()).trim()))
                ext =
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值