gpt4 book ai didi

java - Jersey 更新实体属性 MessageBodyWriter

转载 作者:行者123 更新时间:2023-11-30 03:32:31 26 4
gpt4 key购买 nike

我想创建一个 Jersey 提供程序 ( MessageBodyWriter ),它更新 dto 对象属性并继续链接到 Jersey-json 默认提供程序并返回 json 对象。 问题是,看起来默认提供程序没有被调用,因此一旦我注册新的提供程序,我的其余服务的输出就会变成空。

@Provider
public class TestProvider implements MessageBodyWriter<MyDTO>
{
@Override
public long getSize(
MyDTO arg0, Class<?> arg1, Type arg2, Annotation[] arg3, MediaType arg4)
{
return 0;
}

@Override
public boolean isWriteable(Class<?> clazz, Type type, Annotation[] arg2, MediaType arg3)
{
return type == MyDTO.class;
}


@Override
public void writeTo(
MyDTO dto,
Class<?> paramClass,
Type paramType, Annotation[] paramArrayOfAnnotation,
MediaType mt,
MultivaluedMap<String, Object> paramMultivaluedMap,
OutputStream entityStream) //NOPMD
throws IOException, WebApplicationException
{
dto.setDescription("text Description");
// CONTINUE THE DEFAULT SERIALIZATION PROCESS
}
}

最佳答案

MessageBodyWriter 不需要执行逻辑来操作实体。它的职责只是编码/序列化。

您正在寻找的是 WriterIntercptor ,其目的是准确地执行您想要执行的操作,在序列化之前操作实体。

一切都解释清楚了here in the Jersey Doc for Inteceptors .

这是一个例子

@Provider
public class MyDTOWriterInterceptor implements WriterInterceptor {

@Override
public void aroundWriteTo(WriterInterceptorContext context)
throws IOException, WebApplicationException {
Object entity = context.getEntity();
if (entity instanceof MyDTO) {
((MyDTO)entity).setDescription("Some Description");
}
context.proceed();
}
}

您可以添加注释,以便只有某些资源方法/类使用此拦截器,例如

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.ws.rs.NameBinding;

@NameBinding
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AddDescription {

}
...

@AddDescription
@Provider
public class MyDTOWriterInterceptor implements WriterInterceptor {
...

@Path("dto")
public class MyDTOResource {

@GET
@AddDescription
@Produces(MediaType.APPLICATION_JSON)
public Response getDto() {
return Response.ok(new MyDTO()).build();
}
}

如果由于某种原因你无法更改类(也许这就是你需要在此处设置描述的原因,谁知道呢),那么你可以使用 Dynamic Binding ,您不需要使用注释。您可以简单地进行一些反射来检查方法或类。该链接有一个示例。

关于java - Jersey 更新实体属性 MessageBodyWriter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28679429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com