2

これはできないと思いますが、私が見逃しているトリックがあるかもしれません。同じ MediaType を受け取るさまざまなメソッドを使用したいと考えていますが、メディアタイプに対するパラメーターは異なります。おそらく、これは MediaType パラメータを悪用しています...

@POST
@Consumes("application/json;internal=true")
public Response handleInternal(String request) {
}
@POST
@Consumes("application/json;internal=false")
public Response handleExternal(String request) {
}

Jersey は、同じ MediaType を使用する 2 つのメソッドがあると不平を言っていますが、これは本当です。パラメータで正しいものを選択し続けることを望んでいました。これを機能させるためのトリックはありますか?一言で言えば、入ってくる情報をどのように処理するか (具体的には、ドメイン レベルの検証) について 2 つのユース ケースがあり、これはそれら 2 つを区別する適切な方法のように思えました。

4

1 に答える 1

1

内部json用と外部json用の2つのユーザータイプとともにMessageBodyReaderを使用できます

1- String を拡張するよりも 2 つの型を作成します (委譲を介して -lombok を使用する方が簡単です):

@RequiredArgsConstructor
public class InternalJSON {
    @Delegate
    private final String _theJSONStr;
}
@RequiredArgsConstructor
public class ExternalJSON {
    @Delegate
    private final String _theJSONStr;
}

2- MessageBodyReader タイプを作成します

@Provider
public class MyRequestTypeMapper 
      implements MessageBodyReader<Object> {
    @Override
    public boolean isReadable(final Class<?> type,final Type genericType,
                                  final Annotation[] annotations,
                                  final MediaType mediaType) {
            // this matches both application/json;internal=true and application/json;internal=false
            return mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE); 
    }
        @Override
        public Object readFrom(final Class<Object> type,final Type genericType,
                               final Annotation[] annotations,
                               final MediaType mediaType,
                               final MultivaluedMap<String,String> httpHeaders,
                               final InputStream entityStream) throws IOException,
                                                                       WebApplicationException {
            if (mediaType.getSubType().equals("internal=true") {
                // Build an InternalJSON instance parsing entityStream
                // ... perhaps using JACKSON or JAXB by hand
            } else if (mediaType.getSubType().equals("internal=false") {
                // Build an ExternalJSON instance parsing entityStream
                // ... perhaps using JACKSON or JAXB by hand
            }
        }
}

3- Application で MessageBodyReader を登録します (jersey は @Provider 注釈付きの型のクラスパスをスキャンするため、これはオプションです

@Override
public Set<Class<?>> getClasses() {
    Set<Class<?>> s = new HashSet<Class<?>>();
    ... 
    s.add(MyRequestTypeMapper .class);

    return s;
}

4-内部および外部jsonの2つのユーザータイプを使用して、残りのメソッドを再フォーマットします

于 2013-08-05T21:42:34.220 に答える