Serialization 我可以指定在RestEasy中用于方法结果转换的jackson@JsonView吗?
我正在使用基于Serialization 我可以指定在RestEasy中用于方法结果转换的jackson@JsonView吗?,serialization,jackson,resteasy,wildfly,Serialization,Jackson,Resteasy,Wildfly,我正在使用基于@JsonView的序列化模型。我通常使用ContextResolver配置jackson,如下所示: @Override public ObjectMapper getContext(Class<?> aClass) { // enable a view by default, else Views are not processed Class view = Object.class; if (aClass.getPackage().getN
@JsonView
的序列化模型。我通常使用ContextResolver
配置jackson,如下所示:
@Override
public ObjectMapper getContext(Class<?> aClass) {
// enable a view by default, else Views are not processed
Class view = Object.class;
if (aClass.getPackage().getName().startsWith("my.company.entity")) {
view = getViewNameForClass(aClass);
}
objectMapper.setSerializationConfig(
objectMapper.getSerializationConfig().withView(view));
return objectMapper;
}
并在视图JSONEntity
下序列化。RestEasy是否可以做到这一点?如果不是,我该如何效仿
编辑:我知道我可以自己完成序列化:
public String getAll(@Context UriInfo info, @Context Providers factory) {
List<T> entities = getAll(info.getQueryParameters());
ObjectMapper mapper = factory.getContextResolver(
ObjectMapper.class, MediaType.APPLICATION
).getContext(entityClass);
return mapper.writeValueAsString(entities);
}
publicstringgetall(@Context-UriInfo,@Context-Providers-factory){
List entities=getAll(info.getQueryParameters());
ObjectMapper映射器=factory.getContextResolver(
ObjectMapper.class、MediaType.APPLICATION
).getContext(entityClass);
返回mapper.writeValueAsString(实体);
}
然而,这充其量是笨拙的,并且挫败了让框架处理这个样板文件的整个想法。结果是,可以简单地用@JsonView
注释一个特定的端点(就像在我的问题中一样),jackson将使用这个视图。谁会猜到呢
您甚至可以通过泛型方法()来实现这一点,但这将我与RestEasy联系在一起:
@Override
public void writeTo(Object value, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHd,
OutputStream out) throws IOException {
Class view = getViewFromType(type, genericType);
ObjectMapper mapper = locateMapper(type, mediaType);
Annotation[] myAnn = Arrays.copyOf(annotations, annotations.length + 1);
myAnn[annotations.length] = new JsonViewQualifier(view);
super.writeTo(value, type, genericType, myAnn, mediaType, httpHd, out);
}
private Class getViewFromType(Class<?> type, Type genericType) {
// unwrap collections
Class target = org.jboss.resteasy.util.Types.getCollectionBaseType(
type, genericType);
target = target != null ? target : type;
try {
// use my mix-in as view class
return Class.forName("example.jackson.JSON" + target.getSimpleName());
} catch (ClassNotFoundException e) {
LOGGER.info("No view found for {}", target.getSimpleName());
}
return Object.class;
}
@覆盖
public void writeTo(对象值、类类型、类型genericType、,
注释[]注释,MediaType MediaType,
多值MAP httpHd,
OutputStream out)抛出IOException{
类视图=getViewFromType(类型,genericType);
ObjectMapper mapper=locateMapper(类型,mediaType);
Annotation[]myAnn=Arrays.copyOf(annotations,annotations.length+1);
myAnn[annotations.length]=新的JsonViewQualifier(视图);
super.writeTo(value、type、genericType、myAnn、mediaType、httpHd、out);
}
私有类getViewFromType(类类型,类型genericType){
//拆封收藏
Class target=org.jboss.resteasy.util.Types.getCollectionBaseType(
类型,泛型);
target=target!=null?target:type;
试一试{
//使用我的mix-in作为视图类
返回Class.forName(“example.jackson.JSON”+target.getSimpleName());
}catch(classnotfounde异常){
info(“找不到{}的视图”,target.getSimpleName());
}
返回Object.class;
}
@Override
public void writeTo(Object value, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHd,
OutputStream out) throws IOException {
Class view = getViewFromType(type, genericType);
ObjectMapper mapper = locateMapper(type, mediaType);
Annotation[] myAnn = Arrays.copyOf(annotations, annotations.length + 1);
myAnn[annotations.length] = new JsonViewQualifier(view);
super.writeTo(value, type, genericType, myAnn, mediaType, httpHd, out);
}
private Class getViewFromType(Class<?> type, Type genericType) {
// unwrap collections
Class target = org.jboss.resteasy.util.Types.getCollectionBaseType(
type, genericType);
target = target != null ? target : type;
try {
// use my mix-in as view class
return Class.forName("example.jackson.JSON" + target.getSimpleName());
} catch (ClassNotFoundException e) {
LOGGER.info("No view found for {}", target.getSimpleName());
}
return Object.class;
}