-1

私は次のコードを持っています

@Path("/hello")
public class Hello {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes(MediaType.TEXT_XML)
    public String sayPlainTextHello(@Context UriInfo wsContext) 
    {
        return "hello from xml";
    }
}

これにより、パスが作成されますhttp://localhost:8080/WSTest/rest/hello。ここで、2つの異なるメソッドを使用して、ユーザーが呼び出すhttp://localhost:8080/WSTest/rest/hello.xmlとXMLメソッドに移動し、呼び出すhttp://localhost:8080/WSTest/rest/hello.jsonとJSONメソッドに移動するようにします。現在の実装では、パスを追加する.xml.jsonパスの最後に追加すると、サーバーはエラーを返しnot foundます。

ここで編集 するのは私のweb.xmlです。サブパスを追加する場合は、それが問題ない@Path("{name}.xml")ことを意味することに注意してくださいweb.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>WSTest</display-name>
  <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>com.sun.jersey.config.property.packages</param-name>
      <param-value>com.personal.ws.test</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

PS:パスを変更することはできません。ルートパスをそのままにしておきたいのhttp://localhost:8080/WSTest/rest/helloです。

4

2 に答える 2

0

クライアントに適切なエンコーディングを要求させることで、@Ali が提案したようにこれを行うことができます。

拡張機能のサポートを追加することで、この機能を拡張できます。このようにして、(何らかの理由で) 必要な応答形式を設定できない Web ブラウザーとクライアントは、メディア タイプを切り替えることができます。PackagesResourceConfig次のように拡張することでこれを行うことができます。

public class CommonResourceConfig extends PackagesResourceConfig {

  public CommonResourceConfig(Map<String, Object> props) {
    super(props);
  }

  public CommonResourceConfig(String... packages) {
    super(packages);
  }

  @Override
  public Map<String, MediaType> getMediaTypeMappings() {
    Map<String, MediaType> map = new HashMap<String, MediaType>();
    map.put("xml", MediaType.APPLICATION_XML_TYPE);
    map.put("json", MediaType.APPLICATION_JSON_TYPE);
    return map;
  }
}

javax.ws.rs.Application次に、プロパティをそのクラスの完全修飾名に設定することにより、Jerseyにこの構成を探すように指示します(何らかのDIメカニズムを使用しない限り、web.xmlで)。また、メソッドの @Produces アノテーションを更新して、処理するすべてのメディア タイプをサポートする必要があります。この方法では、サービスのメディア タイプを変更するためだけに、メソッド間で機能を重複させる必要はありません。

EDIT: Hello.javaはあなたが持っているものとまったく同じで、CommonResourceConfigは上記のとおりです(すべてsrc/main/java/com/personal/ws/test/. 動作する残りの構成は次のとおりです(少なくともローカルで):

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>org.example</groupId>
    <artifactId>jersey</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>jerseyTest</name>

    <build>
        <plugins>
            <plugin>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>8.0.3.v20111011</version>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.13</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.13</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey.contribs</groupId>
            <artifactId>jersey-guice</artifactId>
            <version>1.13</version>
        </dependency>
    </dependencies>
</project>

src/main/webapp/WEB-INF/web.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
    <display-name>WSTest</display-name>

    <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.personal.ws.test</param-value>
        </init-param>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.personal.ws.test.CommonResourceConfig</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

</web-app>

a を実行しmvn jetty:runてから wget を実行するか、ブラウザを使用して and をhttp://localhost:8080/rest/hello.json実行しますhttp://localhost:8080/rest/hello.xml。正しい結果が得られました...おそらく小さな構成の問題ですか?

于 2012-07-29T18:53:12.137 に答える
0

@Pathメソッドに注釈を追加する必要があります。

@Path("/rest")
public class Hello {

    @Path("/hello.xml")
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes(MediaType.TEXT_XML)
    public String sayXmlHello(@Context UriInfo wsContext) {
        return "hello from xml";
    }

    @Path("/hello.json")
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes(MediaType.APPLICATION_JSON)
    public String sayJsonHello(@Context UriInfo wsContext) {
        return "hello from json";
    }
}
于 2012-07-28T23:21:19.190 に答える