上周同事遇到了一个问题,就是明明路径存在,但是却报出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 = (java.util.Map.Entry)iterator2.next();
}
if(interceptorAfterPrecedences != null)
{
java.util.Map.Entry ext;
for(Iterator iterator3 =