泽西路线到@Consumes基于MediaType参数?

时间:2013-08-05 21:12:51

标签: java jersey

我怀疑这不可能做到,但也许有一个我不知道的伎俩。我想使用不同的方法,这些方法采用相同的MediaType,但对mediatype具有不同的参数。也许这是滥用MediaType参数......

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

泽西岛抱怨我有两种方法消耗相同的MediaType,这是真的。我希望它继续通过参数选择合适的一个。这项工作有一些技巧吗?简而言之,我有两个用例来处理所传入的信息(特别是域级验证),这似乎是区分这两者的一种不错的方法。

1 个答案:

答案 0 :(得分:1)

您可以使用 MessageBodyReader 以及两种用户类型,一种用于内部json,另一种用于外部json

1-创建两种类型而不是扩展String(通过委托 - 使用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-在应用程序中注册MessageBodyReader(这是可选的,因为泽西将扫描类路径以获取@Provider带注释的类型

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

    return s;
}

4-重新格式化你的休息方法,使用内部和外部json的两种用户类型