나는 eventuallly (내가 여기에 질문을하기 전에해야 할 시작한 일을 실제로) 내 자신의 공급자를 작성하여 문제를 해결했다. 관심 (아직 모르는) 사람들을 위해 : 필요한를 오버라이드 (override)의 MessageBodyWriter 인터페이스를 구현하는 클래스에 @provider 추가
- 다음 @Produces()
- : 자신의 공급자를 작성하는 2 단계를 포함
package com.mypackage;
import com.google.common.collect.Lists;
import com.google.gson.Gson;
import com.mypackage.UploadResponse;
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.io.OutputStreamWriter;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
@Produces("text/plain")
@Provider
public class UploadResponseProvider implements MessageBodyWriter<UploadResponse> {
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
/* You could check the type here, or do some additional checks, but I can just return true, because if it is an UploadResponse (which is inferred via the generic), it's all ok */
return true;
}
@Override
public long getSize(UploadResponse uploadResponse, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return -1;
}
@Override
public void writeTo(UploadResponse uploadResponse, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
OutputStreamWriter writer = new OutputStreamWriter(entityStream);
writer.write(new Gson().toJson(Lists.newArrayList(uploadResponse)));
writer.flush();
}
}
그냥이 코드를 조금 설명 : UploadResponse 반환하는 나의 목적은 방법
내 코드의 존재를했다. 그것은 단순한 POJO이며 getter와 setter를 사용하여 url, size 및 name 필드가 있습니다.
text/plain을 반환하면 blueImp jQuery Fileupload가 작동한다는 것을 알 수 있습니다. 따라서이 텍스트는 UploadResponse의 텍스트/일반 출력용 제공자입니다.
여기서 내가하는 일은 JSON 개체를 만들고 목록에 넣은 다음 해당 목록을 응답에 쓰는 것입니다. 내 UI가 기대하기 때문에 나는 UploadResponses의 목록을 만들고있다. blueImp 파일 업로드에서는 기본적으로 btw가 필요합니다. JAX-RS의 자동 업로드와 1 개의 파일에 대한 하드 제한을 수행 중이므로 하나 이상의 항목을 처리 할 필요가 없습니다. 이 코드를 재사용 할 때 약간의 수정이 필요할 수 있습니다.
여러분도 알다시피, 그게 전부입니다. 나머지는 단지 기본 구현입니다. 왜냐하면 제 경우에는 그 중 아무 것도 신경 쓰지 않기 때문입니다.
작은 메모 : 작성자를 닫지 마십시오. 그냥 내버려둬. 그것을 닫으면 응답에 쓰기 전에 닫힙니다.
아마도 IE의 Accept 헤더를 변경 한 후 JAX-RS에서이를 전달할 수있는 서블릿 필터일까요? 또는 IE에서 JAX-RS의 출력을 가로 채고 재 작성하는 필터입니까? – Thilo
또한 diff @produces를 사용하여 두 가지 방법을 사용할 수 있으며 동일한 방법으로 구분할 수 있습니다. –
와우, 빠른 답장, 고맙습니다 .-) @Thilo : 필터의 응답을 정말로 다시 쓰고 싶지는 않지만, 이음새가 가능해야합니다. 그러나 그것은 고려해야 할 것으로 보입니다. 감사! – gjoris