Jersey - Error writing to server

Meldanor

Bekanntes Mitglied
Hi Leute,

ich moechte folgendes Objekt von einem Client an einem REST Service senden.

Java:
public class PhoenixTask2 implements Sendable {

    private String description;

    private List<PhoenixAttachment> attachments;
    private List<PhoenixText> pattern;

    public PhoenixTask2(String description, List<File> fileAttachments, List<File> filePattern) throws IOException {
        // Erstellung von der Klasse
        }
    }

    public String getDescription() {
        return description;
    }

    public List<PhoenixText> getPattern() {
        return new ArrayList<PhoenixText>(pattern);
    }

    public List<PhoenixAttachment> getAttachments() {
        return new ArrayList<PhoenixAttachment>(attachments);
    }

    @Override
    public ClientResponse send(WebResource rs) {
        return rs.type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, this);
    }

}

Die Klasse hat zwei kleine Wrapper Klassen ->

Java:
public class PhoenixAttachment {

    private byte[] content;
    private Date creationDate;
    private String name;
    private String type;

    public PhoenixAttachment(File file, Date creationDate) throws IOException {
        read(file);

        this.creationDate = creationDate;

        this.name = file.getName();
        int fileSeperator = name.lastIndexOf('.');
        this.type = name.substring(fileSeperator + 1);
        name = name.substring(0, fileSeperator);
    }

    private void read(File file) throws IOException {
        FileInputStream fis = new FileInputStream(file);
        content = new byte[(int) file.length()];
        fis.read(content);
        fis.close();
    }

    @JsonIgnore
    public File getFile() throws IOException {
        File f = File.createTempFile(name, type);
        f.deleteOnExit();
        FileOutputStream fout = new FileOutputStream(f);
        fout.write(content);
        fout.close();
        return f;
    }

    @JsonIgnore
    public InputStream getStream() {
        return new ByteArrayInputStream(content);
    }

    public String getName() {
        return name;
    }

    public String getType() {
        return type;
    }

    public Date getCreationDate() {
        return creationDate;
    }

    public byte[] getContent() {
        return Arrays.copyOf(content, content.length);
    }
}

Java:
public class PhoenixText {

    private String content;
    private Date creationDate;
    private String name;
    private String type;

    public PhoenixText(File file, Date creationDate) throws IOException {
        read(file);

        this.creationDate = creationDate;

        this.name = file.getName();
        int fileSeperator = name.lastIndexOf('.');
        this.type = name.substring(fileSeperator + 1);
        name = name.substring(0, fileSeperator);
    }

    private void read(File file) throws IOException {
        FileInputStream fis = new FileInputStream(file);
        byte[] tmp = new byte[(int) file.length()];
        fis.read(tmp);
        fis.close();

        this.content = new String(tmp);
    }

    public String getText() {
        return content;
    }

    public String getName() {
        return name;
    }

    public String getType() {
        return type;
    }

    public Date getCreationDate() {
        return creationDate;
    }
}

Ich benutze zum marshallen der Objekte Jackson in der Version 2.2.1 und Jersey als REST Service in version 1.17.1.

Die erzeugte JSON Datei scheint aber valide zu sein. Aus irgendeinen Grund kann er nicht senden.

Ich habe auch eine zweite Klasse, namens PhoenixTask(ohne die 2), dort funktioniert es wunderbar. Am Sendeprozess scheint es also nicht direkt zu liegen, sondern die Klasse, die gesendet werden soll.

Weiß wer rat? Die Fehlermeldung ist ein wenig generisch.
 

turtle

Top Contributor
Bei mir funktioniert eine JSON-Response einfach dadurch, das ich eine JAXB-annotierte Klasse als Response zurückgebe.;)

Keinerlei weitere Konfiguration notwendig.

ich habe mal einen kleinen Test mit der Klasse PhoenixAttachment gemacht und entsprechende Annotationen angebracht: Folgender Code
Java:
  @GET
  @Produces({"application/json"})
  public PhoenixAttachment getJson() {
	  try {
		File sampleFile = new File("./sample.txt");
		  PhoenixAttachment phoenixAttachment = new PhoenixAttachment(sampleFile, new Date());
		return phoenixAttachment;
	} catch (IOException e) {
		e.printStackTrace();
	}
	  return null;
  }

produziert folgende JSON-Ausgabe:
{
"@content":"TWVpbmUga2xlaW5lIERhdGVpDQppbiB6d2VpIFplaWxlbg==",
"@creationDate":"2013-10-28T17:48:24.394+01:00",
"@name":"sample",
"@type":"txt"
}
und content ist base64-codierter Inhalt der Datei.
:bloed:Oops, sehe gerade das du AN den Server schicken möchtest. Das muss ich eher nachstellen. Ignorier meine Antwort:autsch:
 
Zuletzt bearbeitet:

Meldanor

Bekanntes Mitglied
Hi,

danke für die Antwort. Meine Frage war leider wohl ein wenig unscharf:

Der Fehler kommt bei der send Methode vom PhoenixTask2
Java:
rs.type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, this);

Diese wird in meinem Test aufgerufen, der u.A. wie folgt aussieht (das drum herum hab ich weggelassen):

Java:
// Create client
Client c = Client.create();
// Get webresource
WebResource wr = c.resource(BASE_URL).path("task").path("create2");
PhoenixTask2 task = new PhoenixTask2("TestAufgabe", ats, texts);
ClientResponse post = task.send(wr);

hier der Text für die Resource.
Java:
@Path("/create2")
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response create2(PhoenixTask2 phoenixTask) {

     //Verabeitung, aber bis dahin kommt er gar nicht
}

Der JSON Request ist ca. 300 KB groß. Kann es was mit der Größe zutun haben?
 
Zuletzt bearbeitet:

Meldanor

Bekanntes Mitglied
Hi Leute,

ich hab das Problem gelöst bekommen.
Es fehlten Standardkonstruktoren in den eigenen Klassen.
Ich habe kurzzeitig auf Jersey 2.4 geupdated und dort wurde aus "Cannot write to Server" ein JSON Fehler. Danach gegoogelt und gemerkt, dass die Standardkonstruktoren fehlen.

Schönen Abend noch :)
 

Ähnliche Java Themen

Neue Themen


Oben