6

JunitTest の開始時に、スタンドアロンのジャージー サーバーを実行しています。JaxRS コントローラーとカスタム HttpClient が機能するかどうかをテストしています。グラスフィッシュに埋め込まれたこの JaxRsResourceController を常に使用できることに注意してください。

これが JaxRsController (軽量版) です

@Path("root")
public class JaxRsResourceController implements
        ResourceController<HttpServletRequest> {

    @Context
    private UriInfo context;
    @Context
    HttpServletRequest request;
    @Context
    HttpServletResponse response;

    @GET
    public String hello(){
        System.out.println("Uri is "+this.context.getBaseUri().toString());
        return "Hello "+peoples;
    }

}

クライアントに問題はありませんが、サーバーを起動すると、次のようになります。

GRAVE: The following errors and warnings have been detected with resource and/or provider classes:
  SEVERE: Missing dependency for field: javax.servlet.http.HttpServletRequest com.robustaweb.library.rest.controller.implementation.JaxRsResourceController.request
  SEVERE: Missing dependency for field: javax.servlet.http.HttpServletResponse com.robustaweb.library.rest.controller.implementation.JaxRsResourceController.response

    at com.sun.jersey.api.container.httpserver.HttpServerFactory.create(HttpServerFactory.java:172)
    at com.robustaweb.library.rest.server.JerseyServer.startServer(JerseyServer.java:44)

基本的には、@Context 注入時に HttpServletRequest に依存しないということです。ただし、リクエストとレスポンスで @Context アノテーションを削除しても、そのままにしておくと問題なくUriInfo context、Uri を読み取ることができます。

ライブラリを強制的に挿入するために Maven pom を数回変更しました。

<dependencies>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.14</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
    </dependency>
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>jsr311-api</artifactId>
        <version>1.1.1</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
    </dependency>
 </dependencies>

何か案が ?

4

2 に答える 2

1

簡単ではありませんでしたが、わかりました。私のJUnitテストでは、次のようなサーバーを作成していました。

HttpServer server = HttpServerFactory.create(url);

しかし、そのようにして、サーブレットコンテナを持たない軽量コンテナを作成するので、失敗の理由もそうです。それで、すべてを手に入れるために、Grizzly Webコンテナ(またはEmbedded Glassfish)を使用できるようにするjersey-test-frameworkを使用しました。

これがMavenです:

<dependencies>
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>jsr311-api</artifactId>
        <version>1.1.1</version>
    </dependency>
    <!-- Unit test are using jersey server directly -->        
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.8.1</version>
        <scope>test</scope>
    </dependency>        
    <dependency>
        <groupId>com.sun.jersey.test.framework</groupId>
        <artifactId>jersey-test-framework</artifactId>
        <version>1.0.3</version>
        <scope>test</scope>
    </dependency>    
</dependencies>

これがJerseyServerTestです:JerseyTestを拡張することに注意してください

public class JerseyServerTest extends JerseyTest {

    protected String baseUri = "http://localhost:" + TestConstants.JERSEY_HTTP_PORT + "/";

    public JerseyServerTest() throws Exception {
        super("com.robustaweb.library.rest.controller");

        /*
        It's possible to NOT call the super() but to manually do :
        1)  ApplicationDescriptor appDescriptor = new ApplicationDescriptor()
                .setRootResourcePackageName(resourcePackageName) // resource packages
                .setContextPath(contextPath) //context of app
                .setServletPath(servletPath); // context of spi servlet
        2)setupTestEnvironment(appDescriptor);
         */
    }

    @Test
    public void testHelloWorldRequest() {
        SunRestClient client = new SunRestClient(baseUri + "root");
        String result = client.GET("", null);
        System.out.println(result);
    }

    @Test
    public void testDeleteRequest() {
        SunRestClient client = new SunRestClient(baseUri + "root");
        String result = client.DELETE("john", null);
        System.out.println(result);
    }
}

そして最後に、@GETと@DELETEを含むリソースファイル

@Path("root")
public class JaxRsController extends JaxRsResourceController{

    List<String> peoples = new ArrayList<String>();

    @GET
    public String hello(){
        System.out.println("Uri is "+getUri());
        return "Hello "+peoples;
    }   

    @DELETE
    @Path("{name}")
    public String deletePeople(@PathParam("name") String name){
        System.out.println("deleting "+name);
        this.peoples.remove(name);
        return String.valueOf(peoples.size());
    }
}

そして今、それは機能します!私はこの記事でいくつかの助けを借りました、そしてドキュメントに関する小さな章があります。ジャージーフレームワークのソースコードを添付できることは本当に役に立ちました。IntelliJにも感謝します。

于 2012-10-24T09:39:17.333 に答える
1

サーブレットの依存関係が別のモジュールに分離されました。追加してみてください

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.14</version>
</dependency>

あなたのポンに。

于 2012-10-24T05:52:05.293 に答える