首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无缓冲CXF (无content-length报头)

无缓冲CXF (无content-length报头)
EN

Stack Overflow用户
提问于 2013-12-17 04:57:16
回答 1查看 650关注 0票数 4

对于JAX-RS应用程序,我最近从使用Jersey切换到使用CXF。我还使用StreamingOutput输出我自己的流,因为流中包含的数据需要大约20秒才能创建,并且可以由客户端部分处理。这一切在Jersey上都工作得很好,但我现在已经切换到使用CXF返回JAXB bean,并且无法获得流行为。在Jersey中,我必须将jersey.config.contentLength.buffer.server设置为0并刷新OutputStream才能将数据发送到客户端,但在CXF中找不到等价物。我尝试过基于StreamInterceptor示例编写一个Interceptor,但是直到所有处理完成后才会调用MessageOutputStreamwrite方法。JAXB bean包含一个带有自定义IteratorCollection,它在数据可用时提供数据。我可以看到数据在调试器中缓冲。

如何使用CXF流式传输JAXB bean?

EN

回答 1

Stack Overflow用户

发布于 2013-12-20 04:48:23

我设法用杰克逊和我自己的MessageBodyWriter、BeanSerializerModifier和JsonSerializer做到了这一点。我仍然需要找到一种使用XML的方法。

代码语言:javascript
复制
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;

import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

/**
 * Created by jayen on 17/12/13.
 */
@SuppressWarnings({"DefaultFileTemplate"})
@Produces({"application/json", "application/*+json"})
@Provider
public class ResponseJSONWriter implements MessageBodyWriter<Response> {
    @Override public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return Response.class.isAssignableFrom(type);
    }

    @Override
    public long getSize(Response response, Class<?> type, Type genericType, Annotation[] annotations,
                        MediaType mediaType) {
        return -1;
    }

    @Override
    public void writeTo(Response response, Class<?> type, Type genericType, Annotation[] annotations,
                        MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream)
    throws IOException, WebApplicationException {
        try {
            ObjectMapper mapper = new ObjectMapper();
            mapper.registerModule(new JaxbAnnotationModule());
            mapper.setSerializerFactory(
                    mapper.getSerializerFactory().withSerializerModifier(new BeanSerializerModifier() {
                        @Override
                        public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc,
                                                                  JsonSerializer<?> serializer) {
                            return new FlushingSerializer<>(serializer);
                        }
                    }));
            mapper.writeValue(entityStream, response);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    private class FlushingSerializer<T> extends JsonSerializer<T> {
        private final JsonSerializer<T> serializer;

        public FlushingSerializer(JsonSerializer<T> serializer) {
            this.serializer = serializer;
        }

        @Override public void serialize(T value, JsonGenerator jgen, SerializerProvider provider)
        throws IOException, JsonProcessingException {
            serializer.serialize(value, jgen, provider);
            jgen.flush();
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20620757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档