2016-05-30 3 views
0

DropwizardはジャージーコンポーネントAを登録します。このコンポーネントを私のカスタムバージョンに置き換えたいと思います。出来ますか?ドキュメントからジャージーコンポーネントの登録を解除することはできますか?

+1

ジャージ成分が何でありますか? – wero

+0

それは 'features'と呼ばれるかもしれません - ' MessageBodyReader's、 'Filter'sなど –

+0

あなたが話している特定のコンポーネントはありますか? –

答えて

0

https://jersey.java.net/documentation/latest/message-body-workers.html#providers-selection

これが意味:

を使用すると、カスタムプロバイダを持っている場合は、カスタムプロバイダが使用されます。例によって

は、私は、ユーザーのクラスを持っていると言う:

public class User { 

    @JsonProperty("name") 
    private String name; 

    @JsonProperty("password") 
    private String password; 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

我々はユーザーを返すリソースがあります。

@Path("/hello/world2") 
@Produces(MediaType.APPLICATION_JSON) 
public class MsgBodyWriterTest { 

    @GET 
    @Path("/v1") 
    @Produces(MediaType.APPLICATION_JSON) 
    public User test() { 
     User u = new User(); 
     u.setName("Test"); 
     return u; 
    } 
} 

をそして、我々は、このユーザーを扱うMessageBodyWriterを持っていますオブジェクト:

@Provider 
public class UserMsgBodyWriter implements MessageBodyWriter<User> { 

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

    @Override 
    public long getSize(User t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void writeTo(User t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, 
      MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) 
      throws IOException, WebApplicationException { 

     System.out.println("Use custom Provider"); 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.writeValue(entityStream, t); 
    } 

} 

我々は、リソースとプロバイダを登録することで、メインで一緒に物事をフック:

public class Starter extends Application<Configuration> { 

    @Override 
    public void run(Configuration configuration, Environment environment) throws Exception { 
     environment.jersey().register(MsgBodyWriterTest.class); 
     environment.jersey().register(UserMsgBodyWriter.class); 
    } 

    public static void main(String[] args) throws Exception { 
     new Starter().run("server", "/Users/artur/dev/repo/dw-test/src/main/resources/configuration.yaml"); 
    } 

} 

始めたとき、それはジャージのリソースを公開し、我々はそれにアクセスすることができます。

arturk:~ artur$ curl -XGET "localhost:9085/hello/world2/v1" 

この

Use custom Provider 
0:0:0:0:0:0:0:1 - - [02/Jun/2016:09:21:31 +0000] "GET /hello/world2/v1 HTTP/1.1" 200 31 "-" "curl/7.43.0" 30 

「カスタムプロバイダを使用する」という出力に注意してください。これは、適切なプロバイダが呼び出されたことを示すだけです。

私はこれがあなたの探していることを望みます。

要するに、フックされるデフォルトのプロバイダはJaxbから提供されます。すべてのjson型を扱い、デフォルトのbeanを直列化することができます。それがなければ、あなたのjsonは解析する方法を知らないでしょう。あなたはそれを取り除きたくないが、むしろそれを取り除く。 独自のプロバイダを作成することで、選択したものが適切なものを選ぶことになります。デフォルトでは、jerseyはデフォルトプロバイダの前にカスタムプロバイダをソートします。したがって、isWriteable()メソッドが正しく実装されている限り、プロバイダはその作業を行うように選択されます。

編集:

実際の質問にお答えください。あなたがDW登録されたプロバイダを取り除かなければならない場合は、その方法もあります。デフォルトのサーバーファクトリを上書きする必要があります。次をご覧ください:

AbstractServerFactory#createAppServlet。これは、デフォルトのプロバイダがフックインされている場所です。あなた自身で登録するだけで、デフォルトは決して使用されません。サーバーファクトリを作成する作業を省くことができます(これはかなり簡単で簡単ですあなたはしたい)。

乾杯、

のArtur

関連する問題