Spring Boot + Angular 5 - нулевые значения http.post - PullRequest
0 голосов
/ 20 мая 2018

Я работаю над проектом клиент / сервер, и я использую весеннюю загрузку и угловую.

Итак, у меня есть форма, и я хочу взять данные из полей ввода и отправить их обратно-конец, моя база данных (mySQL), но проблема в том, что она добавляет только нулевые поля в моей базе данныхВ качестве вдохновения я использовал учебник от devglen и несколько уроков от angular.io

Пример ввода формы:

<div class="form-group">
      <label for="body">Body:</label>
      <input type="text"  class="form-control" id="body"
             [ngModel]="article?.body" (ngModelChange)="article.body = $event" name="body">
    </div> 

Класс модели для статьи, которую я хочу добавить:

export class Article {
  id: string;
  title: string;
  abstract_art: string;
  writer: string;
  body: string;
}

Мой компонент для добавления:

@Component({
  selector: 'app-add',
  templateUrl: './add-article.component.html'
})



export class AddArticleComponent  {



   article: Article = new Article();
   writers: Writer[];

  constructor(private router: Router, private articleService: ArticleService) {

  }
  createArticle(): void {
    console.log(this.article);
    this.articleService.createArticle( this.article).subscribe( data => { alert('Article created successfully.');
    });
    console.log('function called!');
  }

  get diagnostic() { return JSON.stringify(this.article); }
}  

Класс обслуживания:

const httpOptions = {
  headers: new HttpHeaders({ 'Content-Type': 'application/json',
    'Authorization': 'my-auth-token'})
};

@Injectable()
export class ArticleService {

  constructor(private http: HttpClient) {}

   // private userUrl = 'http://localhost:8080/articles';
  private articleUrl = '/api';

  public getArticles() {
    return this.http.get<Article[]>(this.articleUrl);
  }

  public deleteArticle(article) {
    return this.http.delete(this.articleUrl + '/' + article.id, httpOptions);
  }

  public createArticle(article) {
    // const art = JSON.stringify(article);
    console.log(article);
    return this.http.post<Article>(this.articleUrl, article);
  }

}

А теперь для бэк-энда.Класс изделия

@Entity
@Getter @Setter
@NoArgsConstructor
@ToString @EqualsAndHashCode
@Table(name="article")
public class Article {

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

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

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

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

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

    public Article(String title,String abstract_art, String writer, String body) {
        this.title = title;
        this.body = body;
        this.abstract_art = abstract_art;
        this.writer = writer;

    }
}

Репозиторий:

@RepositoryRestResource
//@CrossOrigin(origins = "http://localhost:4200")
public interface ArticleRepository extends JpaRepository<Article,Integer> {
}

Служба артикулов:

@Service
public class ArticleServiceImpl implements ArticleService {

    @Autowired
    private ArticleRepository repository;

    @Override
    public Article create(Article article) {
        return repository.save(article);
    }

    @Override
    public Article delete(int id) {
        Article article = findById(id);
        if(article != null){
            repository.delete(article);
        }
        return article;
    }

    @Override
    public List<Article> findAll() {
        return repository.findAll();
    }

    @Override
    public Article findById(int id) {

        return repository.getOne(id);
    }

    @Override
    public Article update(Article art) {
        return null;
    }
}

И контроллер:

@RestController
@RequestMapping({"/api"})
public class ArticleController {

   @Autowired
   private ArticleService article;

    //Get all articles
    @GetMapping
    public List<Article> listAll(){
        return article.findAll();
    }

    // Create a new Article
    //@PostMapping
    @PostMapping
    public Article createArticle(Article art) {
        return article.create(art);
    }

    // Get a Single Article
    @GetMapping(value="/{id}")
    public Article getArticleById(@PathVariable("id") int id ){
        return article.findById(id);
    }

    // Delete a Note           /art/

    @DeleteMapping(value = "/{id}")
    public void deleteArticle(@PathVariable("id") int id) {
        article.delete(id);
    }

    @PutMapping
    public Article update(Article user){
        return article.update(user);
    }
}

На рисунке видно, что он создает мой объект json, но когда я добавляю его в базу данных, он добавляет только нулевые значения.

Дополнительная информация: я могу получить данные из базы данных иМожно удалить данные из базы данных.

Кстати, это мой первый пост, поэтому я прошу прощения, если я пропустил некоторые рекомендации для публикации.Заранее благодарю за ответы.Хорошего вам!

1 Ответ

0 голосов
/ 20 мая 2018

@ RestController - это удобная аннотация, которая не делает ничего, кроме добавления @ Controller и @.ResponseBody аннотации, а также позволяет классу принимать запросы, отправленные на его путь

@ DOCS
@ResponseBody Аннотация сообщает контроллеру, что возвращаемый объект автоматически сериализуется в JSON и передается обратно в объект HttpResponse.

@RequestBody Аннотация отображает тело HttpRequest в объект передачи или домена, обеспечивая автоматическое включение.десериализация входящего тела HttpRequest на объект Java.

Вы пропустили @RequestBody
@RequestBody отметки о том, что входные данные статьи извлекаются из тела / содержимогозапрос POST.Это заметная разница между GET и POST, поскольку запрос GET не содержит тела.

Измененный код

 @PostMapping
    public Article createArticle(@RequestBody Article art) {
        return article.create(art);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...