33
loading...
This website collects cookies to deliver better user experience
pom.xml
:<dependency>
<groupId>me.alidg</groupId>
<artifactId>errors-spring-boot-starter</artifactId>
<version>1.4.0</version>
</dependency>
spring-boot-starter-validation
:<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
{
"name": "User",
"document": "XXX.XXX.XXX-XX",
"email": "[email protected]"
}
@Cpf
que nos auxiliará:@Documented
@Constraint(validatedBy = CpfValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Cpf {
String message() default "Documento Inválido";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@Cpf
é definida a mensagem que será devolvida para o usuário e também adicionamos @Constraint(validatedBy = CpfValidator.class)
que é classe que contém a lógica para executar a validação.public class CpfValidator implements ConstraintValidator<Cpf, String>{
private final int[] PESO_CPF = { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
@Override
public boolean isValid(String cpf, ConstraintValidatorContext context) {
String cpfSomenteDigitos = cpf.replaceAll("\\D", "");
if ((cpfSomenteDigitos == null) || (cpfSomenteDigitos.length() != 11) || cpfSomenteDigitos.equals("00000000000")
|| cpfSomenteDigitos.equals("11111111111") || cpfSomenteDigitos.equals("22222222222")
|| cpfSomenteDigitos.equals("33333333333") || cpfSomenteDigitos.equals("44444444444")
|| cpfSomenteDigitos.equals("55555555555") || cpfSomenteDigitos.equals("66666666666")
|| cpfSomenteDigitos.equals("77777777777") || cpfSomenteDigitos.equals("88888888888")
|| cpfSomenteDigitos.equals("99999999999")) {
return false;
}
Integer digito1 = calcularDigito(cpfSomenteDigitos.substring(0, 9), PESO_CPF);
Integer digito2 = calcularDigito(cpfSomenteDigitos.substring(0, 9) + digito1, PESO_CPF);
return cpfSomenteDigitos.equals(cpfSomenteDigitos.substring(0, 9) + digito1.toString() + digito2.toString());
}
private int calcularDigito(String str, int[] peso) {
int soma = 0;
for (int indice = str.length() - 1, digito; indice >= 0; indice--) {
digito = Integer.parseInt(str.substring(indice, indice + 1));
soma += digito * peso[peso.length - str.length() + indice];
}
soma = 11 - soma % 11;
return soma > 9 ? 0 : soma;
}
}
@Valid
para que surja efeito.public ResponseEntity<TaxpayerDTO> postTaxpayer(@Valid @RequestBody TaxpayerDTO taxpayer)
document
no DTO TaxpayerDTO.@Cpf
private String document;
{
"errors": [
{
"code": "Documento invalido",
"message": null
}
]
}
null
e no campo code está com a mensagem que definimos na Annotation CPF.messages.properties
na pasta Resources do projeto e lá adicionamos as mensagens.invalid.document=Documento invalido
String message() default "invalid.document";
{
"errors": [
{
"code": "invalid.document",
"message": "Documento invalido"
}
]
}
@Override
public void send(CommonDTO taxpayerDTO) {
TaxPayer taxPayer = TaxPayer.newBuilder().setName(((TaxpayerDTO) taxpayerDTO).getName())
.setDocument(((TaxpayerDTO) taxpayerDTO).getDocument()).setSituation(false).setEmail(((TaxpayerDTO) taxpayerDTO).getEmail()).build();
// Aqui está o lançamento da Exception
if(taxPayer.getName().contains("Guilherme")) {
throw new BadTaxpayerUser(taxPayer.getName());
}
producer.send(this.createProducerRecord(taxPayer), (rm, ex) -> {
if (ex == null) {
log.info("Data sent with success!!!");
} else {
log.error("Fail to send message", ex);
}
});
producer.flush();
}
@Getter
@ExceptionMapping(statusCode = HttpStatus.I_AM_A_TEAPOT, errorCode = "bad.user.message")
public class BadTaxpayerUser extends RuntimeException {
@ExposeAsArg(value = 0, name = "user")
private final String key;
public BadTaxpayerUser(String key) {
super(key);
this.key = key;
}
}
@ExceptionMapping
e nela passamos no campo statusCode
o código HTTP que deve ser retornado e no campo errorCode
é passado a chave da mensagem, que está em resources
, que deve ser exibida.@ExposeAsArg
iremos adicionar ao arquivo message.properties
a mensagem que deve ser exibida e vamos customizá-la dessa forma:bad.user.message=O user {user} nao pode!!!
@ExposeAsArg
no atributo key da Exception temos que informar que o primeiro argumento que está entre chaves, {user}
, deve ser interpolado pelo valor a ser recebido na exceção.{
"name": "Guilherme Paulo Carlos Eduardo Dias",
"document": "893.475.166-51",
"email": "[email protected]"
}
{
"errors": [
{
"code": "bad.user.message",
"message": "O user Guilherme Paulo Carlos Eduardo Dias nao pode!!!"
}
]
}