Resolver for token headers
Header values in class:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserClaims {
private Long userId;
private String customerId;
private String taxId;
private Boolean isDirector;
private String personalCode;
}
Resolver class:
import jakarta.servlet.http.HttpServletRequest;
import java.util.Objects;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.MissingRequestHeaderException;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
public class UserClaimsResolver implements HandlerMethodArgumentResolver {
private static final String ARGUMENT_NAME = "userClaims";
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
Class<?> clazz = methodParameter.getParameterType();
return clazz.equals(UserClaims.class) && (Objects.equals(methodParameter.getParameterName(), ARGUMENT_NAME));
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest,
WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request = (HttpServletRequest) nativeWebRequest.getNativeRequest();
return resolveUserClaims(request, methodParameter);
}
private UserClaims resolveUserClaims(HttpServletRequest request, MethodParameter methodParameter)
throws MissingRequestHeaderException {
Long userId = validateUserId(request, methodParameter);
String customerId = validateCustomerId(request, methodParameter);
String taxId = validateTaxId(request, methodParameter);
Boolean isDirector = validateIsDirector(request, methodParameter);
String personalCode = validatePersonalCode(request);
return UserClaims.builder()
.userId(userId)
.customerId(customerId)
.taxId(taxId)
.isDirector(isDirector)
.personalCode(personalCode)
.build();
}
private Long validateUserId(HttpServletRequest request, MethodParameter methodParameter)
throws MissingRequestHeaderException {
String userId = request.getHeader(HEADER_USER_ID);
if (StringUtils.isBlank(userId)) {
throw new MissingRequestHeaderException(HEADER_USER_ID, methodParameter);
}
return Long.valueOf(userId);
}
private String validateCustomerId(HttpServletRequest request, MethodParameter methodParameter)
throws MissingRequestHeaderException {
String customerId = request.getHeader(HEADER_CUSTOMER_ID);
if (StringUtils.isBlank(customerId)) {
throw new MissingRequestHeaderException(HEADER_CUSTOMER_ID, methodParameter);
}
return customerId;
}
private String validateTaxId(HttpServletRequest request, MethodParameter methodParameter)
throws MissingRequestHeaderException {
String taxId = request.getHeader(HEADER_TAX_ID);
if (StringUtils.isBlank(taxId)) {
throw new MissingRequestHeaderException(HEADER_TAX_ID, methodParameter);
}
return taxId;
}
private Boolean validateIsDirector(HttpServletRequest request, MethodParameter methodParameter)
throws MissingRequestHeaderException {
String isDirector = request.getHeader(HEADER_IS_DIRECTOR);
if (StringUtils.isBlank(isDirector)) {
throw new MissingRequestHeaderException(HEADER_IS_DIRECTOR, methodParameter);
}
return Boolean.valueOf(isDirector);
}
private String validatePersonalCode(HttpServletRequest request) {
return request.getHeader(HEADER_PERSONAL_CODE);
}
}
Usage:
@PostMapping("/{invoiceNumber}/payments/card")
@ResponseStatus(HttpStatus.OK)
public PaymentResponse makePaymentByCard(
@Valid @Parameter(hidden = true) UserClaims userClaims,
@PathVariable String invoiceNumber,
@RequestBody PaymentByCardRequestDto paymentByCardRequestDto,
@RequestHeader(HEADER_USER_ID) Long userId) {
return invoiceService.makePaymentByCard(userClaims, invoiceNumber, paymentByCardRequestDto, userId);
}
Comments
Post a Comment