Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to properly override a function in Java?

Tags:

java

I have the following BO's

@Data
public abstract class CommonBO extends BaseBO{

    @NotBlank(message ="{validation.not.blank}")
    @Length(max = 100)
    String name;
}


@Data
@MappedSuperclass
public abstract class CommonPersist extends BasePersist {

    @Column(unique = true,nullable = false)
    private String name;

}

Then my BaseController

public abstract class BaseController <T extends BasePersist, K extends BaseBO> {

 @RequestMapping(value = "/validate", method = RequestMethod.POST)
    @ResponseBody
    public ValidationResponse validate(@Valid K t,
                                       BindingResult result, Locale locale) {
        ValidationResponse res = new ValidationResponse();
        List<ErrorMessage> errorMessages = new ArrayList<>();
        if (!result.hasErrors()) {
            res.setStatus(MessageTypes.SUCCESS);
        } else {
            res.setStatus(MessageTypes.FAIL);
            List<FieldError> allErrors = result.getFieldErrors();
            errorMessages = new ArrayList<>();
            for (FieldError objectError : allErrors) {
                errorMessages.add(new ErrorMessage(objectError.getField(),
                        objectError.getDefaultMessage()));
            }
        }
        res.setErrorMessageList(errorMessages);
        return res;
    }

}

Lastly, my another abstract controller

public abstract class CommonController<T extends CommonPersist, K extends CommonBO> extends BaseController {

  @Override
    public ValidationResponse validate(@Valid K t, BindingResult result, Locale locale) {
        ValidationResponse res = super.validate(t, result, locale);
        if (res.getStatus().equalsIgnoreCase(MessageTypes.SUCCESS)) {
            if (commonService.checkIfNameIsUsed(t.getName(), t.getId())) {
                ErrorMessage em = new ErrorMessage("name", messageSource.getMessage("error.duplicate.is.used", null, locale));
                res.getErrorMessageList().add(em);
                res.setStatus(MessageTypes.FAIL);
            }
        }
        return res;
    }
}

The @Override annotation gives error that "Method does not override method from its superclass". I thought since CommonBo extends BaseBO, the @Override function should be overriding the methodin BaseController ?

Updated

based on @Slaks answer

public abstract class CommonController<T extends CommonPersist, K extends CommonBO> extends BaseController<T,K> {

@Override
    public ValidationResponse validate(@Valid K t, BindingResult result, Locale locale) {
        ValidationResponse res = super.validate(t, result, locale);
        if (res.getStatus().equalsIgnoreCase(MessageTypes.SUCCESS)) {
            if (commonService.checkIfNameIsUsed(t.getName(), t.getId())) {
                ErrorMessage em = new ErrorMessage("name", messageSource.getMessage("error.duplicate.is.used", null, locale));
                res.getErrorMessageList().add(em);
                res.setStatus(MessageTypes.FAIL);
            }
        }
        return res;
    }
}
like image 777
abiieez Avatar asked Jan 28 '26 17:01

abiieez


1 Answers

Your CommonController class extends BaseController, but does not specify any type parameters (<...>).

Therefore, the compiler interprets that as BaseController<Object, Object>.

Your method doesn't take Object as a parameter, so it doesn't match the base type.

You need to specify type parameters in the extends clause:

public abstract class
  CommonController<T extends CommonPersist, K extends CommonBO>
       extends BaseController<T,K> {
like image 119
SLaks Avatar answered Jan 31 '26 07:01

SLaks



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!