我怀疑这不可能做到,但也许有一个我不知道的伎俩。我想使用不同的方法,这些方法采用相同的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,这是真的。我希望它继续通过参数选择合适的一个。这项工作有一些技巧吗?简而言之,我有两个用例来处理所传入的信息(特别是域级验证),这似乎是区分这两者的一种不错的方法。
答案 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的两种用户类型