2013-07-11 5 views
5

mio MessageBodyWriterRESTEasy non riconosce personalizzato scrittore del corpo del messaggio

@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(); 
    } 
} 

mio riposo Applicazione

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

Estensione dell'applicazione

@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; 
    } 
} 

Quando eseguo in modalità debug posso colpire la mia classe JaxRsActivator, quindi so che i provider vengono caricati. Tuttavia ottengo l'errore "Impossibile trovare MessageBodyWriter per oggetto risposta del tipo: net.comp.jaxb.JaxbList di tipo di supporto: text/csv"

+0

è 'classes.add (AppREST.class);' un errore di battitura? O ti sei semplicemente dimenticato di rendere in qualche modo disponibile ApplicationREST? –

+0

questo è un errore di battitura. its ApplicationREST –

+0

@Cam Sonaris - Potete pubblicare la vostra implementazione di MessageBodyWriter? – gregwhitaker

risposta

5

Sulla base della sua codice di cui sopra, sembrerebbe che il tuo CSVMessageBodyWriter viene chiamato, ma sta fallendo il tuo controllo isWriteable.

Il tuo controllo isWriteable restituirà sempre false. Stai verificando se JaxbList è assegnabile da CSVSerializer. Questo fallirà sempre e il tuo CSVMessageBodyWriter non sarà ritenuto in grado di gestire text/csv.

provare a cambiare il metodo IsWriteable al seguente:

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

Ciò serializzare tutti text/csv metodi annotati. Se si desidera vincolare a JaxbList allora si può fare qualcosa di simile:

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; 
} 

Ecco un semplice esempio di lavoro di configurazione di un personalizzato MessageBodyWriter:

Applicazione

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; 
    } 
} 

Risorsa

@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

Grazie mille! –