下面是一種完成此方法的概念驗證。我從來沒有使用過這個,所以我不能提供任何證明任何維護性問題的可能性,或者可能不符合大型項目的要求。我只是在一個簡單的項目上測試過。
它基本上使用澤西的Programmatic resource building API追加版本到原始路徑。
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.core.Configuration;
import javax.ws.rs.ext.Provider;
import org.glassfish.jersey.server.model.ModelProcessor;
import org.glassfish.jersey.server.model.Resource;
import org.glassfish.jersey.server.model.ResourceModel;
@Provider
public class VersioningModelProcessor implements ModelProcessor {
private Map<String, String> packageAppenders = new HashMap<>();
{
packageAppenders.put("com.stackoverflow.jersey.v1", "v1");
packageAppenders.put("com.stackoverflow.jersey.v2", "v2");
}
@Override
public ResourceModel processResourceModel(ResourceModel model, Configuration config) {
// Create new resourc model.
ResourceModel.Builder newModelBuilder = new ResourceModel.Builder(false);
for (final Resource resource: model.getResources()) {
// Look for the package
String path = resource.getPath();
Class handlerClass = resource.getHandlerClasses().iterator().next();
String pkg = handlerClass.getPackage().getName();
// Match the packge to our map of packages
if (packageAppenders.containsKey(pkg)) {
// append the version
String version = packageAppenders.get(pkg);
path = version + "/" + path.replace("/", "");
Resource.Builder resourceBuilder = Resource.builder(resource);
resourceBuilder.path(path);
Resource newResource = resourceBuilder.build();
System.out.println(newResource.toString());
// add the new resource with the new path.
newModelBuilder.addResource(newResource);
} else {
// Do nothing. Just add the resource as normal
newModelBuilder.addResource(resource);
}
}
return newModelBuilder.build();
}
@Override
public ResourceModel processSubResource(ResourceModel model, Configuration config) {
return model;
}
}
可能比它的價值更麻煩。我不知道。你可以成爲法官。
我會接受你的答案,因爲它回答我的原始問題。我最終採取了不同的路徑,請看我的答案。 – wujek
@wujek是的我完全忘了這麼做。我會繼續並接受你自己的答案。它更有意義。 –