I use Entrez Utilities Web Service library to access pubmed articles from my Java application (using pubmed identifier). Full working example how to use this tool was published by Renaud in this post on github. Everything works fine in most cases, however lately I found a pubmed id which makes the library crash.
The code that I use looks like this:
public PubmedArticleType searchById(Integer id) throws RemoteException {
EUtilsServiceStub.ESearchRequest req = new EUtilsServiceStub.ESearchRequest();
req.setDb("pubmed");
req.setTerm(id+"[uid]");
req.setEmail("[email protected]");
req.setUsehistory("y");
EUtilsServiceStub.ESearchResult res = service.run_eSearch(req);
String webEnv = res.getWebEnv();
String query_key = res.getQueryKey();
EFetchPubmedServiceStub.EFetchRequest req2 = new EFetchPubmedServiceStub.EFetchRequest();
req2.setWebEnv(webEnv);
req2.setQuery_key(query_key);
EFetchPubmedServiceStub.EFetchResult res2 = service2.run_eFetch(req2);
for (int j = 0; j < res2.getPubmedArticleSet().getPubmedArticleSetChoice().length; j++) {
PubmedArticleType art = res2.getPubmedArticleSet().getPubmedArticleSetChoice()[j].getPubmedArticle();
if (art != null) {
return art;
}
}
return null;
}
When I call this function with id = 22363258
I get the error that isn't informative at all:
org.apache.axis2.AxisFault
at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
at gov.nih.nlm.ncbi.www.soap.eutils.EFetchPubmedServiceStub.fromOM(EFetchPubmedServiceStub.java)
at gov.nih.nlm.ncbi.www.soap.eutils.EFetchPubmedServiceStub.run_eFetch(EFetchPubmedServiceStub.java:189)
at ch.epfl.bbp.uima.pubmed.PubmedSearch.searchById(PubmedSearch.java:130)
at ch.epfl.bbp.uima.pubmed.PubmedSearchTest.testPubmedId(PubmedSearchTest.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.IllegalArgumentException
at gov.nih.nlm.ncbi.www.soap.eutils.EFetchPubmedServiceStub$PubModel_type0$Factory.fromString(EFetchPubmedServiceStub.java:20118)
at gov.nih.nlm.ncbi.www.soap.eutils.EFetchPubmedServiceStub$PubModel_type0$Factory.fromString(EFetchPubmedServiceStub.java:20129)
at gov.nih.nlm.ncbi.www.soap.eutils.EFetchPubmedServiceStub$ArticleType$Factory.parse(EFetchPubmedServiceStub.java)
at gov.nih.nlm.ncbi.www.soap.eutils.EFetchPubmedServiceStub$MedlineCitationType$Factory.parse(EFetchPubmedServiceStub.java:28780)
at gov.nih.nlm.ncbi.www.soap.eutils.EFetchPubmedServiceStub$PubmedArticleType$Factory.parse(EFetchPubmedServiceStub.java:19147)
at gov.nih.nlm.ncbi.www.soap.eutils.EFetchPubmedServiceStub$PubmedArticleSetChoiceE$Factory.parse(EFetchPubmedServiceStub.java)
at gov.nih.nlm.ncbi.www.soap.eutils.EFetchPubmedServiceStub$PubmedArticleSet_type0$Factory.parse(EFetchPubmedServiceStub.java:56549)
at gov.nih.nlm.ncbi.www.soap.eutils.EFetchPubmedServiceStub$EFetchResult$Factory.parse(EFetchPubmedServiceStub.java:50607)
... 27 more
So, I have two questions:
- What is the reason? What I can do to fix it?
- Is there any other java API that I could use to access pubmed abstracts? I know I can parse html pages, but I realy don't want to do it, because it introduces more problems than it solves...
Here is a RESTful API that allows to retrieve abstracts and all meta informations from pubmed db.
The exact link that would retrieve all the data that I needed looks like this: http://www.ebi.ac.uk/europepmc/webservices/rest/search/resulttype=core&query=ext_id:22363258