2013-07-11 10 views
5

Moja MessageBodyWriterRESTEasy nie rozpoznaje własnego ciała wiadomość pisarza

@Provider 
@Produces("text/csv") 
public class CSVMessageBodyWriter implements MessageBodyWriter<JaxbList> 

    public static final String CONTENT_DISPOSITION_HEADER = "Content-Disposition";  
    //$NON-NLS-1$ 
    private final static HeaderDelegate<ContentDispositionHeader> header = RuntimeDelegate.getInstance().createHeaderDelegate(ContentDispositionHeader.class); 

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

    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { 
     return CsvSerializer.class.isAssignableFrom(type); 
    } 

    public void writeTo(JaxbList t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, 
        OutputStream entityStream) throws IOException, WebApplicationException { 

     // set content disposition. This will enable browsers to open excel 
     ContentDispositionHeader contentDispositionHeader = ContentDispositionHeader.createContentDispositionHeader(MediaTypeUtils.CSV_TYPE); 
     contentDispositionHeader.setFileName("representation"); //$NON-NLS-1$ 
     httpHeaders.putSingle(CONTENT_DISPOSITION_HEADER, header.toString(contentDispositionHeader)); 

     Charset charset = Charset.forName(ProviderUtils.getCharset(mediaType)); 
     OutputStreamWriter writer = new OutputStreamWriter(entityStream, charset); 

     PrintWriter printWriter = new PrintWriter(writer); 
     Iterator<String[]> rows = ((CsvSerializer) t).getEntities(); 
     while (rows.hasNext()) { 
      printWriter.println(CsvWriter.getCSVRow(rows.next())); 
     } 
     printWriter.flush(); 
    } 
} 

mego odpoczynku Zastosowanie

@Path("app/v3") 
@GZIP 
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, "text/csv"}) 
public class ApplicationREST 

Rozszerzenie stosowania

@ApplicationPath("/") 
public class JaxRsActivator extends Application { 

    private Set<Object> singletons = new HashSet<Object>(); 
    private Set<Class<?>> classes = new HashSet<Class<?>>(); 

    public JaxRsActivator() { 
    singletons.add(new CSVMessageBodyWriter()); 
    classes.add(ApplicationREST.class); 
    } 

    @Override 
    public Set<Object> getSingletons() { 
    Set<Object> defaults = super.getSingletons(); 
    singletons.addAll(defaults); 
    return singletons; 
    } 

    public Set<Class<?>> getClasses() { 
    return classes; 
    } 
} 

Kiedy uruchomić w trybie debugowania mogę trafić moja klasa JaxRsActivator, więc wiem, że dostawcy są ładowani. Jednak pojawia się błąd "Nie można znaleźć MessageBodyWriter dla obiektu odpowiedzi typu: net.comp.jaxb.JaxbLista typu mediów: text/csv"

+0

jest 'classes.add (AppREST.class);' literówka? A może po prostu zapomniałeś jakoś udostępnić ApplicationREST? –

+0

To jest literówka. jego ApplicationREST –

+0

@Cam Sonaris - Czy możesz przesłać swoją implementację MessageBodyWriter? – gregwhitaker

Odpowiedz

5

Na podstawie powyższego kodu wydaje się, że Twój CSVMessageBodyWriter jest wywoływany, ale to nie sprawdza twojego sprawdzenia.

Twoja kontrola isWriteable zawsze zwróci false. Sprawdzasz, czy JaxbList można przypisać z poziomu CSVSerializer. To zawsze zawiedzie i Twój CSVMessageBodyWriter nie zostanie uznany za zdolny do obsługi text/csv.

Spróbuj zmienić isWriteable sposób na następujące kwestie:

public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) 
{ 
    return true; 
} 

Będzie serializacji wszystkie text/csv adnotacją metod. Jeśli chcesz ograniczyć go do JaxbList następnie można zrobić coś takiego:

public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) 
{ 
    ParameterizedType paramType = (ParameterizedType) genericType; 

    if(paramType.getRawType().equals(JaxbList.class)) 
    { 
     return true; 
    } 

    return false; 
} 

Oto prosty przykład roboczych od konfiguracji niestandardowej MessageBodyWriter:

Application

public class ProductGuideApplication extends Application 
{ 
    private Set<Object> singletons = new HashSet<Object>(); 
    private Set<Class<?>> classes = new HashSet<Class<?>>(); 

    public ProductGuideApplication() 
    { 
     singletons.add(new CSVMessageBodyWriter()); 
     classes.add(FooResource.class); 
    } 

    @Override 
    public Set<Object> getSingletons() 
    { 
     return singletons; 
    } 

    @Override 
    public Set<Class<?>> getClasses() 
    { 
     return classes; 
    } 
} 

Zasób

@Path("/foo") 
public class FooResource 
{ 
    @GET 
    @Produces("text/csv") 
    public List<Consumer> getConsumers() 
    { 
     Consumer consumer1 = new Consumer(); 
     consumer1.setId("1234"); 
     consumer1.setGender("Male"); 

     Consumer consumer2 = new Consumer(); 
     consumer2.setId("2345"); 
     consumer2.setGender("Male"); 

     List<Consumer> consumers = new ArrayList<Consumer>(); 
     consumers.add(consumer1); 
     consumers.add(consumer2); 

     return consumers; 
    } 
} 

MessageBodyWriter

@Provider 
@Produces("text/csv") 
public class CSVMessageBodyWriter implements MessageBodyWriter<List<Consumer>> 
{ 
    @Override 
    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) 
    { 
     ParameterizedType paramType = (ParameterizedType) genericType; 

     if(paramType.getRawType().equals(List.class)) 
     { 
      if(paramType.getActualTypeArguments()[0].equals(Consumer.class)) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 

    @Override 
    public long getSize(List<Consumer> t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) 
    { 
     return 0; 
    } 

    @Override 
    public void writeTo(List<Consumer> t, Class<?> type, Type genericType, 
      Annotation[] annotations, MediaType mediaType, 
      MultivaluedMap<String, Object> httpHeaders, 
      OutputStream entityStream) throws IOException, 
      WebApplicationException 
    { 
     //Write your CSV to entityStream here. 
    } 
} 
+0

Dziękuję bardzo! –