2 回答
TA贡献1818条经验 获得超11个赞
在这里,您使用与请求正文和响应正文相同的对象。这不是标准做法。
您应该有单独的请求/响应对象。在请求对象中,您应该只从用户那里获得您需要的信息。但是在响应对象中,您应该包含要在响应中发送的信息以及验证信息,例如错误详细信息,其中包括错误代码和错误描述,您可以使用它们向用户显示验证错误。
希望这可以帮助。
TA贡献1836条经验 获得超3个赞
好吧,如果date_expiration
过期或identification_card
不符合客户的要求,这就是商业失败。
我喜欢用 来表示业务错误HTTP 422 - Unprocessable Entity
。
如果您想在控制器中返回不同的对象,您可以将返回对象从 更改ResponseEntity<CreditCard>
为,但如果目的是返回错误,我更喜欢在带注释的方法中使用 a 。ResponseEntity<Object>
ExceptionHandler
ControllerAdvice
正如我所说,这种情况是业务失败(信用卡已过期或对当前用户不适用)。
这是一个例子。会是这样的:
CardService.java
@Service
public class CardService {
// ..
public CreditCard registerCard(CreditCard card) throws BusinessException {
if(cardDoesntBehaveToUser(card, currentUser()))) // you have to get the current user
throw new BusinessException("This card doesn't behave to the current user");
if(isExpired(card)) // you have to do this logic. this is just an example
throw new BusinessException("The card is expired");
return cardRepository.save(card);
}
}
CardController.java
@PostMapping("/card")
public ResponseEntity<Object> payCard(@Valid@RequestBody CreditCard creditCard) throws BusinessException {
CreditCard creC = cardService.registerCard(creditCard);
return ResponseEntity.ok(creC);
}
BusinessException.java
public class BusinessException extends Exception {
private BusinessError error;
public BusinessError(String reason) {
this.error = new BusinessError(reason, new Date());
}
// getters and setters..
}
BusinessError.java
public class BusinessError {
private Date timestamp
private String reason;
public BusinessError(String Reason, Date timestamp) {
this.timestamp = timestamp;
this.reason = reason;
}
// getters and setters..
}
MyExceptionHandler.java
@ControllerAdvice
public class MyExceptionHandler extends ResponseEntityExceptionHandler {
// .. other handlers..
@ExceptionHandler({ BusinessException.class })
public ResponseEntity<Object> handleBusinessException(BusinessException ex) {
return ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).body(ex.getError());
}
}
如果信用卡过期,JSON 将呈现为:
{
"timestamp": "2019-10-29T00:00:00+00:00",
"reason": "The card is expired"
}
添加回答
举报