Android - JSON必须以数组或对象开头。

时间:2016-06-03 17:11:36

标签: android spring jhipster retrofit2

我可以说我是整个编程世界的新手!

案例是我正在使用Retrofit2与JHipster集成Android项目。

好吧,我要做的是将图像保存到数据库(MySQL),保存在byte []字段中。

这就是我在后端用户实体上的内容:

@Entity
@Table(name = "usuario")
public class Usuario implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotNull
    @Column(name = "name", nullable = false)
    private String name;

    @Lob
    @Column(name = "image")
    private byte[] image;

    @Column(name = "image_content_type")    
    private String imageContentType;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public byte[] getImage() {
        return image;
    }

    public void setImage(byte[] image) {
        this.image = image;
    }

    public String getImageContentType() {
        return imageContentType;
    }

    public void setImageContentType(String imageContentType) {
        this.imageContentType = imageContentType;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Usuario usuario = (Usuario) o;
        if(usuario.id == null || id == null) {
            return false;
        }
        return Objects.equals(id, usuario.id);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(id);
    }

    @Override
    public String toString() {
        return "Usuario{" +
            "id=" + id +
            ", name='" + name + "'" +
            ", image='" + image + "'" +
            ", imageContentType='" + imageContentType + "'" +
            '}';
    }
}

这就是我在Android Class上所拥有的:

public class Usuario {
    Long id;
    String name;
    String image;
    String imageContentType;

    public Usuario() {
    }

    public Usuario(Long id, String name, String image) {
        this.id = id;
        this.name = name;
        this.image = image;

    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getImageContentType() {
        return imageContentType;
    }

    public void setImageContentType(String imageContentType) {
        this.imageContentType = imageContentType;
    }

我也尝试将图像保存在Android的Byte []中,但是因为当我试图获取用户信息时我无法得到响应(我收到的JSON文件似乎有问题)从后端开始,当Android想要一个字符串时,我收到一个数组),我必须使用一个字符串。所以我在REST资源上实现了一个方法,将该String转换为Byte [],如下所示:

@RequestMapping(value = "/usuarios/{img}/{id}",
    method = RequestMethod.PUT,
    produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity<Usuario> convertImage(@Valid @RequestBody Usuario usuario, @RequestBody String img, @RequestBody Long id) {
    log.debug("REST request to get Usuario : {}", id, img);
    usuario = usuarioRepository.findOne(id);
    byte[] b = img.getBytes();
    usuario.setImage(b);
    Usuario result = usuarioRepository.save(usuario);
    return ResponseEntity.ok()
        .headers(HeaderUtil.createEntityUpdateAlert("usuario", usuario.getId().toString()))
        .body(result);
}

我想我没有正确使用@RequestMapping,但不知何故从JHipster CRUD使用API​​方法工作正常,问题似乎是Android / Retrofit2方法,如下所示:

这就是服务:

@Multipart
@PUT("/api/usuarios/{id}/{img}")
Call<Usuario> convertImage(
        @Header("Authorization") String Authorization,
        @Part("img") String img, @Part("id") Long id
);

我在UserManager上的内容:

public synchronized void convertImage(final UsuarioCallback usuarioCallback, String img, Long id) {
    Call <Usuario> call = usuarioService.convertImage(UserLoginManager.getInstance(context).getBearerToken(), img, id);
    call.enqueue(new Callback<Usuario>() {
        @Override
        public void onResponse(Call<Usuario> call, Response<Usuario> response) {

            int code = response.code();

            if (code == 200 || code == 201) {

            } else {
                usuarioCallback.onFailure(new Throwable("ERROR" + code + ", " + response.raw().message()));
            }
        }

这就是我打电话和传递信息的方式:

ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); 
    byte[] byte_arr = stream.toByteArray();
    String imgString = Base64.encodeToString(byte_arr,
            Base64.DEFAULT);
    Usuario usuario = new Usuario();
    usuario.setId(Long.parseLong("1"));
    Long id = usuario.getId();
    UsuarioManager.getInstance(view.getContext()).convertImage(EditProfile.this, imgString, id);

有了这一切,我得到了标题中显示的错误,所以我真的不知道这有什么不妥。

我想这就是我应该提供的所有信息,对不起,如果我错过了一些东西,但是我有点迷失了这个错误而且我已经被困在这里好几个星期了。

事先谢谢你!

1 个答案:

答案 0 :(得分:0)

我建议采用不同的方法,而不是将图像放在DB或JSON中。

数据库:旨在保存,搜索,排序许多小块数据,通常最好将引用(可能是UUID)放到文件系统上的二进制文件中。 Here是关于注意事项的好文章

JSON 这是格式化的文字。在文本中编码byte []数据然后编码为byte []以通过网络发送将增加大量开销。虽然大多数人(以及大多数JSON库)可能更适合与图像共享URL或直接为图像制作REST endpoint