2013-07-11 7 views
5

Mein MessageBodyWriterResteasy keine benutzerdefinierten Nachrichtentext Schriftsteller erkennen

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

Meine REST Anwendung

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

Erweiterung der Anwendungs ​​

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

Wenn ich im Debug-Modus laufen kann ich getroffen Meine JaxRsActivator-Klasse, daher weiß ich, dass die Provider geladen werden. Allerdings bekomme ich den Fehler "Konnte MessageBodyWriter für Antwort Objekt vom Typ nicht finden: net.comp.jaxb.JaxbList des Medientyps: text/csv"

+0

Ist 'classes.add (AppREST.class);' ein Tippfehler? Oder hast du gerade vergessen, den ApplicationREST irgendwie verfügbar zu machen? –

+0

das ist ein Tippfehler. sein ApplicationREST –

+0

@Cam Sonaris - Können Sie bitte Ihre MessageBodyWriter-Implementierung posten? – gregwhitaker

Antwort

5

Basierend auf Ihrem Code oben würde es scheinen, dass Ihre CSVMessageBodyWriter aufgerufen wird, aber es ist Ihr isWriteable Check fehlgeschlagen.

Ihre isWriteable Prüfung wird immer false zurückgeben. Sie prüfen, ob JaxbList von CSVSerializer zuweisbar ist. Dies wird immer fehlschlagen und Ihre CSVMessageBodyWriter wird nicht als fähig angesehen, text/csv zu behandeln.

Versuchen Sie isWriteable Methode auf die folgende Veränderung:

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

Dies wird serialisiert alle text/csv kommentierten Methoden. Wenn Sie es JaxbList einschränken wollen, dann können Sie etwas tun:

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

Hier ist ein einfaches Ausführungsbeispiel einer benutzerdefinierten konfigurieren MessageBodyWriter:

Anwendung

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

Ressource

@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

Vielen Dank! –