[英]Required request body is missing:in spring boot and angular 9
我正在使用 angular 9 和 spring 啟動 2。
我在 angular 9 中有一項服務 class 為:
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { Book } from '../common/book';
import { BookCategory } from '../common/book-category';
import { Finalcart } from '../common/finalcart';
const httpOptions = {
headers: new HttpHeaders({ 'Content-Type': 'application/json' })
};
@Injectable({
providedIn: 'root'
})
export class BookService {
private finalCart="http://localhost:8080/api/test/";
constructor(private httpClient:HttpClient) { }
addFinalCart(finalCart:Finalcart):Observable<any>{
return this.httpClient.post(`${this.finalCart}`+'finalCart',finalCart,httpOptions);
}
}
在我的 spring 引導中,我將 api 暴露為:
@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/api/test")
public class TestController {
@PostMapping("/finalCart")
@PreAuthorize("hasRole('USER') or hasRole('MODERATOR') or hasRole('ADMIN')")
public ResponseEntity<?> finalCart(@RequestBody Finalcart finalCart) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String user = auth.getName();
System.out.println(user);
System.out.println(finalCart);
UserDetailsImpl userDetails=(UserDetailsImpl)userdetailService.loadUserByUsername(user);
User u=new User(userDetails.getId(),userDetails.getUsername(),userDetails.getPassword(),userDetails.getEmail());
Order ord= orderRep.save(new Order(u,new Date()));
Billingaddress ba= billAddressRepo.save(new Billingaddress(finalCart.getBillingAddress(),ord));
System.out.println(ba);
Shippingaddress sa=shippingAddressRepo.save(new Shippingaddress(finalCart.getShippingAddress(),ord));
System.out.println(sa);
finalCart.getCartItem().forEach(s->{
Optional<Book> b=bookrepository.findById(Long.valueOf(s.getBookId()).longValue());
CartItem c=cartItemRepo.save(new CartItem(s.getName(),s.getImageUrl(),s.getUnitPrice(),s.getQuantity(), b.get()));
orderDetailRepostiory.save(new OrderDetails(c,ord));
});
if(ord!=null) {
return new ResponseEntity(ord, HttpStatus.OK);
}
else {
return new ResponseEntity("BadException", HttpStatus.BAD_REQUEST);
}
}
}
}
所以,當我調用 api /finalCart
時,我得到錯誤:
2020-07-05 19:57:08.187 WARN 17400 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public org.springframework.http.ResponseEntity<?> in.ashwin.onlinebookstore.controller.TestController.finalCart(in.ashwin.onlinebookstore.entity.Finalcart)]
因此復制了相同的 JSON 數據並嘗試從 postman 發送此數據,但它正在工作。
I send the JSON data and there is no error when I send from postman.But,when I try to send the data using angular service class then,I get error.
我的 FinalCart.java 是:
package in.ashwin.onlinebookstore.entity;
import java.util.List;
public class Finalcart {
private Billingaddress billingAddress;
private Creditcard creditCard;
private Shippingaddress shippingAddress;
private List<CartItem> cartItem;
public Billingaddress getBillingAddress() {
return billingAddress;
}
public void setBillingAddress(Billingaddress billingAddress) {
this.billingAddress = billingAddress;
}
public Creditcard getCreditCard() {
return creditCard;
}
public void setCreditCard(Creditcard creditCard) {
this.creditCard = creditCard;
}
@Override
public String toString() {
return "Finalcart [billingAddress=" + billingAddress + ", creditCard=" + creditCard + ", shippingAddress="
+ shippingAddress + "]";
}
public Finalcart() {
}
public Shippingaddress getShippingAddress() {
return shippingAddress;
}
public void setShippingAddress(Shippingaddress shippingAddress) {
this.shippingAddress = shippingAddress;
}
public List<CartItem> getCartItem() {
return cartItem;
}
public void setCartItem(List<CartItem> cartItem) {
this.cartItem = cartItem;
}
}
book.component.ts. 當我單擊提交按鈕時,方法 onSubmit() 被觸發。我使用 JWT 進行身份驗證?我是否還需要在進行 PostMapping 時傳遞 JWT 令牌?
@Component({
selector: 'app-checkout',
templateUrl: './checkout.component.html',
styleUrls: ['./checkout.component.css']
})
export class CheckoutComponent implements OnInit {
cartItems: CartItem[] = [];
totalPrice: number = 0;
totalQuantity: number = 0;
checkoutFormGroup: FormGroup;
finalCart:Finalcart;
constructor(private formBuilder: FormBuilder,private _cartService: CartService,
private _bookService:BookService) { }
ngOnInit() {
//I have not included all codes,only the required ones.
}
onSubmit() {
if (this.checkoutFormGroup.invalid) {
return;
}
console.log(this.cartItems);
console.log('Purchase the books');
let finalCart=new Finalcart(this.checkoutFormGroup.value.billingAddress,
this.checkoutFormGroup.value.shippingAddress, this.checkoutFormGroup.value.creditCard, this.cartItems);
console.log('finalcart is',finalCart);
this._bookService.addFinalCart(this.finalCart);
}
}
請更新 onSubmit 方法如下。 您正在方法中創建一個名為 finalCart 的新變量,但在對服務的調用中傳遞組件級 finalCart
onSubmit() {
if (this.checkoutFormGroup.invalid) {
return;
}
console.log(this.cartItems);
console.log('Purchase the books');
this.finalCart=new Finalcart(this.checkoutFormGroup.value.billingAddress,
this.checkoutFormGroup.value.shippingAddress, this.checkoutFormGroup.value.creditCard, this.cartItems);
console.log('finalcart is',this.finalCart);
this._bookService.addFinalCart(this.finalCart);
}
更改您的 header 選項並嘗試使用text/plain
const httpOptions = {
headers: new HttpHeaders({ 'Content-Type': 'text/plain' })
};
因為對於請求正文,它被視為文本
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.