6

特に問題を解決しようとしているわけではありませんが、ジャージへの学習の道を進んでいます。

次のようにマークされたエンティティクラスがあります。

@Entity
@Table(name = "myentity")
@XmlRootElement
public class MyEntity implements serializable {
  // lots of methods...
}

および対応するジャージ サービス

@Stateless
@Path("entity")
public class EntityFacade {

    @GET
    @Path("{param}")
    @Produces({"application/xml;charset=UTF-8"})
    public List<MyEntity> find(@PathParam("param") String param) {
       List entities = entityManager.getResultList(); // retrieve list from db
       return entities;
    }

}

正しい XML 応答を返します。XML応答を生成する同じ動作を複製する MessageBodyWriter を書きたいとしたら、どうすればそれを行うことができますか?

@Provider
public class TrasformerMessageBodyWriter implements MessageBodyWriter<Object> {

    @Override
    public long getSize(Object o, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType) {
        return 0;
    }

    @Override
    public boolean isWriteable(Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType) {
        // return true or false depending if I want to rewrite the response
    }

    @Override
    public void writeTo(Object o, Class<?> type, Type genericType,
            Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders,
            OutputStream entityStream) throws IOException,
            WebApplicationException {
        // what do I need to write here...
    }
}

@Provider アノテーションを付けると、メッセージ本文ライターが正しく呼び出されていることがわかります。

writeTo が呼び出されると、Object o は Vector で、Type genericType は List ですが、この時点で、XML でオブジェクトを変換する方法について完全に迷っています。

最後に、jersey とその注釈によってすべてが既に提供されている場合、MessageBodyWriter はどのように役立つのでしょうか?

繰り返しますが、これは単なる学術的な演習です。

4

1 に答える 1

9

通常、 を使用しMessageBodyWriterて、Jersey が何も知らないデータ形式にオブジェクトを変換します。TableDataドメイン オブジェクトを CSVに変換する例を次に示します。

@Singleton
@Produces("text/csv")
@Provider
public class FederationCsvWriter implements MessageBodyWriter<TableData> {

  @Override
  public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
    return TableData.class.isAssignableFrom(type);
  }

  @Override
  public long getSize(TableData data, Class<?> type, Type genericType, Annotation annotations[], MediaType mediaType) {
    return -1;
  }

  @Override
  public void writeTo(TableData data, Class<?> type, Type genericType, Annotation[] annotations,
      MediaType mediaType, MultivaluedMap<String, Object> headers, OutputStream out) throws IOException {
    Writer osWriter = new OutputStreamWriter(out);
    CSVWriter writer = new CSVWriter(osWriter, ',', '"', "\r\n");
    if (data.getResultCount() > 0) {
      //Write the header
      writer.writeNext(data.getResult().get(0).keySet().toArray(new String[data.getResult().get(0).keySet().size()]));

      //Write the data
      for (ModelData row: data.getResult()) {
        writer.writeNext(row.values().toArray(new String[row.values().size()]));
      }
    }
    writer.flush();
  }

}

あなたの例では、オブジェクトを自分で調べて結果を にフィードすることで XML を作成するか、OutputStreamJAXB (Jersey が内部で使用する) を使用してオブジェクトを に直接マーシャリングすることができますOutputStream。演習の目的としては、おそらく JAXB の方が興味深いでしょう。

于 2013-05-24T19:40:12.177 に答える