1

I try to upload a file from an angularJS front to a jboss backoffice, but i get this exeption when service is called:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of byte[] out of START_OBJECT token
 at [Source: io.undertow.servlet.spec.ServletInputStreamImpl@1cc8ac9f; line: 1, column: 39] (through reference chain: fr.test.Document["datas"

])

I guess there is something wrong when i convert the javascript File in java bytes[], but i don't really know what.

I collect the file via a regular input type="file":

<input
type="file"
style="display: none;"
onchange="angular.element(this).controller().addDocument(this)"
>

Then i catch result with an onchange method in my controller: (i read on this link Return the Array of Bytes from FileReader() that i have to use a promise, that's return a bytes array).

...
ctrl.addDocument = function(element){
    var file = element.files[0];

    var fileData = new Blob([element.files[0]]);
    var promise = new Promise(
            function(resolve){
                var reader = new FileReader();
                reader.readAsArrayBuffer(fileData);
                reader.onload = function() {
                  var arrayBuffer = reader.result
                  var bytes = new Uint8Array(arrayBuffer);
                  resolve(bytes);
                }
            }
    );
    promise.then(function(data) {
        var document = {
                name: file.name,
                type: file.type,
                datas: data
            };
        console.dir(document);
        ctrl.doc = document;
    }).catch(function(err) {
        console.log(err);
         growl.error('Unable to upload file');
    });
}
...

Finally, backoffice is called, using a rest service. Here the declaration of my backoffice's service:

@POST
@Path("/uploadFile")
@Consumes(MediaType.APPLICATION_JSON)
public void uploadFile(Document document) {
    LOGGER.info("upload document !");
}

And the document object that contains same properties:

public class Document {

    private byte[] datas;
    private String name;
    private String type;

    public byte[] getDatas() {
        return datas;
    }
    public void setDatas(byte[] datas) {
        this.datas = datas;
    }
    ...

If i comment the line "ctrl.doc = document;" in my controller (the bytes part), service work correctly.

What i missed ? Can i really send a file this way ?

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.