【问题标题】:Postmapping not getting called when api called from angular to spring boot当 api 从 Angular 调用到 Spring Boot 时,没有调用 Postmapping
【发布时间】:2020-07-05 12:32:59
【问题描述】:

我有一个服务类book.service.ts

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){

  return this.httpClient.post(`${this.baseUrl}`+'finalCart',finalCart, httpOptions);   
}

服务方式 addFinalCart(finalCart:Finalcart) 正在从 component.ts 文件中调用:

@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);
  }
}

所以,我有 JWT 身份验证,并且我已经成功登录并在调用 api 时:

http://localhost:8080/api/test/finalCart

我在spring boot中公开的api没有被调用。但是,当我从postman调用api时,api在spring boot中被成功调用,但是从postman我也传递了令牌信息,但是虽然从角度的服务类我没有发送用户信息。

package in.ashwin.onlinebookstore.controller;

@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/api/test")
public class TestController {
    
    @Autowired
    UserDetailsServiceImpl userdetailService;
    
    @Autowired
    private OrderRepository orderRep;
    
    @Autowired
    private BookRepository bookrepository;
    
    @Autowired
    private CartItemRepository cartItemRepo;
    
    @Autowired
    private OrderDetailsRepository orderDetailRepostiory;
    

    
    @Autowired
    private BillingaddressRepository billAddressRepo;
    
    @Autowired
    private ShippingaddressRepository shippingAddressRepo;
    
    @PostMapping("/finalCart")
    @PreAuthorize("hasRole('USER') or hasRole('MODERATOR') or hasRole('ADMIN')")
    public String finalCart(@RequestBody Finalcart finalCart,HttpServletRequest request) {
        String user=request.getUserPrincipal().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()));
     System.out.println(ord);
     
     
     
    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));    
     });
     
     
       System.out.println(userDetails.getUsername()+userDetails.getPassword());
        System.out.println("entered here");
        System.out.println(finalCart);
        System.out.println(finalCart.getBillingAddress());
        System.out.println(finalCart.getShippingAddress());
        System.out.println(finalCart.getCreditCard());
        return "null";
    }
}

我看到在 Eclipse 中我的控制台中没有打印任何内容。我认为我在从 Angular 服务类发送信息时出错了。

【问题讨论】:

    标签: java angular spring spring-boot


    【解决方案1】:

    您需要订阅addFinaCart 才能使 API 调用正常工作

    this._bookService.addFinalCart(this.finalCart).subscribe(
            (response) => {
            console.log(response.body);
            },
           (err)=>{
           console.log("Error",err); //======> In case of failure
           }
    )
    

    【讨论】:

    • 由于我在 spring boot finalCart(@RequestBody Finalcart finalCart,HttpServletRequest request) 中有两个参数,因为有 HttpServletRequest 我得到了错误。如何从角度服务方法将其设置为所需的 false?
    • 当我把订阅方法调用我的 api
    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 2021-11-03
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2021-03-25
    相关资源
    最近更新 更多