2017-05-21 1 views
1

J'ai un référentiel de repos de données Springdonnées de printemps override reste propriété nichée de gestionnaire POST

public interface ProjectRepository extends CrudRepository<Project, Integer> {} 

pour l'entité suivante:

@javax.persistence.Entity 
@Table(name = "project", uniqueConstraints = {@UniqueConstraint(columnNames = {"owner_id", "title"})}) 
public class Project { 

    @Id 
    @Column(name = "project_id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 

    ... 

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    @JoinTable(name = "project_document", joinColumns = { 
      @JoinColumn(name = "project_id", nullable = false, updatable = false) }, 
      inverseJoinColumns = { @JoinColumn(name = "document_id", 
        nullable = false, updatable = false) }) 
    private Set<Document> documents; 

    ... 
} 

Je veux remplacer le gestionnaire POST de la collection documents imbriquée et suis le recommended approach.

@RepositoryRestController 
public class DocumentController { 


    @RequestMapping(value = "/projects/{projectId}/documents", method = RequestMethod.POST) 
    public Document postDocument(
      final @PathVariable int projectId, 
      final @RequestPart("file") MultipartFile documentFile, 
      final @RequestPart("description") String description 
    ) throws IOException { 
     ... 
    } 
} 

Mais quand je lance le POST imbriqué, il utilise toujours le gestionnaire POST généré Spring original et lancers francs erreur non prise en charge de type de média.

Quand je change @RepositoryRestController à @RestController, le gestionnaire correct POST est utilisé, mais ne sont pas exportées méthodes CRUD générées par ressort pour documents de sous-ressource project.

Répondre

0

Essayez quelque chose comme ceci:

@RequiredArgsConstructor 
@RepositoryRestController 
@RequestMapping("/projects/{id}") 
public class ProjectsController { 

    private final @NonNull DocumentRepository documentRepository; 

    @PostMapping("/documents") 
    public ResponseEntity<?> postDocument(@PathVariable("id") Project project, @RequestBody Document document) { 
     if (project == null) { 
      throw new Exception("Project is not found!"); 
     } 

     if (document == null) { 
      throw new Exception("Document is not found"); 
     } 

     Document savedDocument = documentRepository.save(document.setProject(project)); 
     return new ResponseEntity<>(new Resource<>(savedDocument), CREATED); 
    } 
} 

travail example.