2017-12-31 200 views
2

私は@Override注釈がメソッドからメソッドをオーバーライドしていない」というエラーを与える以下のBOのJavaの関数を正しく上書きする方法は?

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

} 

その後、私の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; 
    } 

} 

最後に、私の別の抽象コントローラ

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

を持っていますそのスーパークラス "です。私はCommonBo extends BaseBO以来の考え、@Override関数はmethodin BaseControllerをオーバーライドする必要がありますか?

@Slaksに基づいて

を更新しましたが

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; 
    } 
} 
+3

あなたは、あなたの基本型の型パラメータを指定する必要があります。 – SLaks

+0

私はあまりそれほど質問しないことを願っています。あなたはコードの例で回答を投稿できますか? – abiieez

+0

'CommonPersist'は' BasePersist'を拡張しますか? –

答えて

3

あなたCommonControllerクラスはBaseControllerを拡張しますが、任意の型パラメータ(<...>)を指定していないに答えます。

したがって、コンパイラはそれをBaseController<Object, Object>と解釈します。

あなたのメソッドはパラメータとしてObjectをとらないので、基本型と一致しません。

あなたはextends句で型パラメータを指定する必要があります。

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

これは現在動作しています。ポインタありがとう! – abiieez

関連する問題