2017-06-28 4 views
0

J'essaie de créer une application de gestion du cycle de vie.Objet de l'entité d'envoi en réponse qui contient le blob

J'ai un objet entité qui contient deux éléments blob. Voici mon objet entité. Comme vous pouvez le voir, il y a deux éléments de type 'resume_file' et 'photo' comme vous pouvez le voir.

Je souhaite renvoyer une réponse JSON à l'appel de l'API.

Le code de mon contrôleur est indiqué ci-dessous.

@Controller 
    @RequestMapping("/v1") 
    public class UsersController { 

    @Autowired 
     private IUserMetaProfileService userMetaProfileService; 


    @GetMapping("MetaProfile/{id}") 
     public ResponseEntity<UserMetaProfile> getUserMetaProfileById(@PathVariable("id") Integer id) { 
      UserMetaProfile userMetaProfile = userMetaProfileService.getUsersById(id); 
      return new ResponseEntity<UserMetaProfile>(userMetaProfile, HttpStatus.OK); 
     } 

    } 

Mais quand je l'appelle l'API, je reçois l'exception:

"exception": "org.springframework.http.converter.HttpMessageNotWritableException", 

"message": "Could not write JSON document: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: 
... 

    ...nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) 
+0

Vous essayez d'ajouter un fichier binaire à une chaîne JSON. Ce n'est pas possible. Si vous voulez vraiment ajouter des fichiers binaires à une chaîne JSON, vous devez encoder en base64 les fichiers binaires. – Eich

Répondre

1

Depuis JSON ne peut pas contenir des données binaires que vous devez sérialiser ces champs comme quelque chose d'autre. Vous avez quelques options:

  1. Si vous avez l'intention d'afficher le fichier binaire en tant qu'image (étant donné que le vôtre est une photo), vous pouvez le sérialiser comme un uri de données.
  2. Envoie à la place des liens vers des photos et crée une méthode de contrôleur qui produira les données binaires avec le type de contenu approprié (hors portée ici).

Donc, pour l'option 1, vous pouvez faire quelque chose comme ceci:

@Entity 
@Table(name="user_meta_profile") 
public class UserMetaProfile implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name = "user_id") 
    private int user_id; 

    @Column(name = "resume_file") 
    @Lob 
    private Blob resume_file; 

    @Column(name = "photo") 
    @Lob 
    private Blob photo; 

    @Column(name = "username") 
    private String username; 

    public int getUser_id() { 
     return user_id; 
    } 

    public void setUser_id(int user_id) { 
     this.user_id = user_id; 
    } 

    @JsonIgnore // disable serializing this field by default 
    public Blob getResume_file() { 
     return resume_file; 
    } 

    // serialize as data uri insted 
    @JsonProperty("resumeData") 
    public String getResume() { 
     // just assuming it is a word document. you would need to cater for different media types 
     return "data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64," + new String(Base64.getEncoder().encode(resume_file.getBytes())); 
    } 

    public void setResume_file(Blob resume_file) { 
     this.resume_file = resume_file; 
    } 

    @JsonIgnore // disable this one too 
    public Blob getPhoto() { 
     return photo; 
    } 

    // serialize as data uri instead 
    @JsonProperty("photoData") 
    public String getPhotoBase64() { 
     // just assuming it is a jpeg. you would need to cater for different media types 
     return "data:image/jpeg;base64," + new String(Base64.getEncoder().encode(photo.getBytes())); 
    } 

    public void setPhoto(Blob photo) { 
     this.photo = photo; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 
} 

Pour la photo bit la valeur de l'photoData attribut JSON peut être réglé directement comme l'attribut src d'une balise img et la photo sera rendu dans le HTML. Avec le fichier de CV, vous pouvez le joindre comme href à une balise <a> avec un attribut download il peut être téléchargé:

<a href={photoData value here} download>Download Resume File</a> 

Tout comme un FYI si les fichiers sont volumineux JSON sera énorme et il pourrait aussi ralentir le navigateur.

+0

Merci, Strelok.Il a travaillé. – codeLearner