JAX-RSでUriBuilderを使用するAbstractMethodError
非同期応答を使用してREST Webサービスを構築しようとしています。
私はこのエラーをウェブ上で見ましたが、解決策はありませんでした。どうすればいいのかわかりません。
これは、RESTサービス、AsyncResponse、および@Suspended
で指定されたjarファイルから取得されるpom.xml
を含むサービスのコードです。問題は、戦争を展開すると、例外が発生することです:
Java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.Java:119)
com.Sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.Java:651)
javax.servlet.http.HttpServlet.service(HttpServlet.Java:728)
org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.50 logs
私のクラスは次のとおりです。
package com.crudapp;
import Java.util.ArrayList;
import Java.util.List;
import Java.util.concurrent.Callable;
import Java.util.concurrent.ExecutorService;
import Java.util.concurrent.Executors;
import Java.util.concurrent.Future;
import javax.annotation.Generated;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
//import javax.ws.rs.core.UriBuilder;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.google.gson.Gson;
import com.mysql.jdbc.StringUtils;
import dao.User;
import dao.UserDAO;
import dao.UserDAOImpl;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;
@Path("/crudpath")
public class EntityResource {
private final ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("/spring.xml");
UserDAO userdao = null;
private final int numOfThreads = 10;
private final ExecutorService executorService = Executors.newFixedThreadPool(numOfThreads);
// userdao.getUsers("118");
//ctx.close();
@GET
@Produces("application/json")
public Response getTupleFromDBasJSON(@QueryParam("param1") String userid, @Suspended final AsyncResponse asyncresponse ){
if(StringUtils.isNullOrEmpty(userid))
throw new ServiceException("Userid passed to the REST service /crudpath is null or empty");
userdao = (userdao==null)?
ctx.getBean("userDAO", UserDAOImpl.class)
: userdao;
Gson gson = new Gson();
Future<List<User>> futures = executorService.submit(new DAOTaskHandlerThread(userid));
List <User> users = new ArrayList<User>();
if(futures.isDone())
{
try{
users = futures.get();
if(users!= null)
return Response.status(200).entity( gson.toJson(users).toString()).build();
}
catch(Exception ex)
{
throw new ServiceException(ex);
}
}
return Response.status(200).entity(new ArrayList<User>().toString()).build();
/*// crrate a new thread.. call the DAO .. returns the result from here.
JSONObject jsonObject = new JSONObject();
jsonObject.put("key", "value");
return Response.status(200).entity( jsonObject.toString()).build();*/
}
private class DAOTaskHandlerThread implements Callable<List<User>>{
//private UserDAO userDAO;
private String userid;
private DAOTaskHandlerThread(//UserDAO userDAO,
String useridpassed){
///this.userDAO= userDAO;
userid= useridpassed;
}
@Override
public List<User> call() throws Exception {
// TODO Auto-generated method stub
return userdao.getUsers(userid);
}
}
}
Mavenのpom.xml
ファイルは次のとおりです。
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>RESTJerseyExample</groupId>
<artifactId>RESTJerseyExample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<!-- spring framework just added -->
<properties>
<Java-version>1.7</Java-version>
<org.springframework-version>4.0.3.RELEASE</org.springframework-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework-version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- spring framework just added ends here -->
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-bundle</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20140107</version>
</dependency>
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>org.Apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.0</version>
</dependency>
<!-- used for httpclient library -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.Apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.2</version>
</dependency>
<!-- for async response -->
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0-m12</version>
</dependency>
</dependencies>
</project>
AbstractMethodError
areアプリケーションが抽象メソッドを呼び出そうとするとスローされます。
uri
は UriBuilder
の抽象メソッドであるため、この実装が必要です。このメソッド(String
パラメーター付き)は、JAX-RS仕様のバージョン2.0
からのものです。
Jersey 1. *でJAX-RS 2.0を使用しようとしています。代わりに、JAX-RS 2.0を実装し、uri
メソッドへの実装を含むJersey 2. *を使用する必要があります。
pom.xml
で、これらの依存関係を削除できます。
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-bundle</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0-m12</version>
</dependency>
そして、これらの依存関係を使用します。
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.17</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.17</version>
</dependency>
これを使用して、uri
メソッドが JerseyUriBuilder
jersey-common
のクラスに実装されます。
[〜#〜] edit [〜#〜]:
web.xml
で、サーブレットcom.Sun.jersey.spi.container.servlet.ServletContainer
をorg.glassfish.jersey.servlet.ServletContainer
に、init-param
をcom.Sun.jersey.config.property.packages
からjersey.config.server.provider.packages
に変更する必要があります
この投稿に1つの答えを追加したいと思います。今日、同様の問題に直面し、根本的な原因は別の依存jarであることがわかりました。これは内部で古いバージョンのJersey/JAX-RSを使用しているです。
修正前の私のPOMは次のとおりです。
<jersey.version>2.17</jersey.version>
...
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>com.ci.wrapper</groupId>
<artifactId>client-wrapper</artifactId>
<version>${clients-wrapper.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.api.commons</groupId>
<artifactId>transferobjects</artifactId>
<version>3.0.2</version>
</dependency>
問題は「com.ci.wrapper」と「com.api.commons」にありました。これらには、ジャージーとJAX-RS 1.Xバージョンを使用していたBraveJerseyとorg.Apache.cxf.cxf-rt-frontend-jaxrs(2.5.1)の2つの異なるJARが含まれていました。
ネストされたjarを除外し、BraveJersey2/org.Apache.cxf.cxf-rt-frontend-jaxrs(3.1.5)の新しいバージョンを追加すると、解決されました。
<dependency>
<groupId>com.api.commons</groupId>
<artifactId>transferobjects</artifactId>
<version>3.0.2</version>
<exclusions>
<exclusion>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<groupId>org.Apache.cxf</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.1.5</version>
</dependency>
<dependency>
<groupId>com.ci.wrapper</groupId>
<artifactId>client-wrapper</artifactId>
<version>${clients-wrapper.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<artifactId>brave-jersey</artifactId>
<groupId>com.github.kristofa</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.kristofa</groupId>
<artifactId>brave-jersey2</artifactId>
<version>2.4.2</version>
</dependency>
同様の問題に直面している場合は、プロジェクトまたはjarのincludedが互換性のないバージョンのJersey/Jax-RSを使用しているかどうかを確認してください。
プロジェクトの1つでライブラリ(カスタムビルド)を使用しようとしたときに、この問題に直面しました。そのため、com.Sun.jersey依存関係の不一致が原因で問題が発生していました。私のプロジェクトではjerseyバージョン2.15を使用していましたが、カスタムライブラリではバージョン1.17のcom.Sun.jerseyを一時的に使用していました。
だから、そのような問題を見つける方法。
gradle dependencies
タスクを使用して依存関係を見つけます(ネストされたレベルの結果が得られるため、すべての推移的な依存関係も表示されます)
依存関係の原因となっている問題を特定したら。プロジェクトに必要な依存関係を追加するときにそれらを除外します。
例えばhttpRestClientは、プロジェクトで使用したいカスタムライブラリの名前です。依存関係を追加し、同時にグループ'com.Sun.jersey'
の競合する依存関係を除外した方法を次に示します。
compile(httpRestClient) {
exclude group: 'com.Sun.jersey'
}
これにより、どのライブラリでも使用でき、競合するライブラリを除外できます。
ありがとう。
私の場合、この問題を解決するにはcxf-rt-frontend-jaxrsとhttpclintの両方の組み合わせを削除する必要があります。これらのjarには両方ともjavax.ws.rs.core.UriBuilderクラスがあり、このクラスの複数バージョンが問題を引き起こしました。
私のPOMは、削除した後、これらのjarに一時的に依存していました。
enter code here
<exclusion>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
</exclusion>
<exclusion>
<groupId>org.Apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</exclusion>
私たちの場合、犯人はこの依存関係でした
<dependency>
<groupId>org.Apache.wink</groupId>
<artifactId>wink-common</artifactId>
<version>1.0-incubating</version>
</dependency>