0

Web サービスで「text/csv」を生成したいと考えています。

Apache から maven 依存関係 CsvSerializerProvider を含めました。プロバイダーであり、次のように「text/csv」を生成します

@Provider
@Produces("text/csv")
public class CsvSerializerProvider implements MessageBodyWriter<CsvSerializer> {
}

今私のWebサービスで私は @Produces("text/csv") のように

@Produces({MediaType.APPLICATION_XML, "text/csv"})
public class RecordREST {
}

curl を使用してエンドポイントに到達しようとすると、次のエラーが表示されます

Could not find MessageBodyWriter for response object of type: jaxb.JaxbList of media type: text/csv

標準なので.xmlをうまく取得できますが、csvは明らかにこれが適切にリンクされていません。どうすればいいですか?

4

1 に答える 1

0

エラー メッセージには、 を書き込もうとしているが、 のオブジェクトを書き込むように構成されていることが示されてJaxbListいます。MessageBodyWriterCsvSerializer

メソッドが を返し、JaxbListResteasy でそれを CSV に変換したい場合は、MessageBodyWriterを処理する が必要になりますJaxbList

@Provider
@Produces("text/csv")
public class CsvSerializerProvider implements MessageBodyWriter<JaxbList> {
}

理想的には、Web サービスのメソッドがドメイン オブジェクト を返し、Fooケースでは JAXB アノテーションが付けられCsvSerializerProvider、次のようになります。

@Provider
@Produces("text/csv")
public class CsvSerializerProvider implements MessageBodyWriter<Foo> {
}

また、プロバイダーが Resteasy に登録されていることを確認する必要があります。

  • JBoss AS7 で実行している場合@Provider、追加の設定なしでアノテーション スキャンが自動的に処理されます

  • のサブクラスでサービスをブートストラップする場合はjavax.ws.rs.core.Application、プロバイダーを Application サブクラスに登録できます。

public class MyApplication extends Application
{
  private Set<Object> singletons = new HashSet<Object>();

  public MyApplication() 
  { 
      singletons.add(new MyCustomMessageBodyWriter());
      singletons.add(new MyResource());
  }

  @Override
  public Set<Object> getSingletons()
  { 
      return singletons;
  }
}
  • サービスを でサーブレットとして開始する場合は、Resteasyorg.jboss.resteasy.plugins.server.servlet.HttpServletDispatcherに注釈を自動的にスキャンするように指示する必要が@Providerあります。resteasy.scanresteasy.scan.providerstrueweb.xml
<context-param>
   <param-name>resteasy.scan</param-name>
   <param-value>true</param-value>
</context-param>
  • Spring を使用して Resteasy リソースを登録している場合は、 to をorg.jboss.resteasy.plugins.spring.SpringContextLoaderListener追加して Spring にそれらをスキャンするように指示できます。includeFilterComponentScan
@ComponentScan(value = "com.foo", 
               includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, value = Provider.class))
于 2013-07-03T23:36:57.267 に答える