LogronJ
LogronJ

Reputation: 601

How to pass an unknown class Type in ResponseEntity<>

public void etisLogAround(ProceedingJoinPoint joinPoint, EtisLog etisLog) throws Throwable {

        Object[] args = joinPoint.getArgs();
         MethodSignature methodSignature = (MethodSignature) joinPoint.getStaticPart().getSignature();
         Method method = methodSignature.getMethod();

         String[] paramNames =  ((MethodSignature) joinPoint
                    .getSignature()).getParameterNames();

         for(String paramName: paramNames) {
             logger.info("paramName:" +paramName);
         }


        try {

            Object result = joinPoint.proceed();

             if(methodSignature instanceof MethodSignature) {
                 final Class<?>[] parameterTypes = methodSignature.getParameterTypes();
                    for(final Class<?> pt : parameterTypes){
                        logger.info("Parameter type:" + pt);
                    }
             }

            @SuppressWarnings("unchecked")
            ResponseEntity<CaseOutlineHeader> returnValue = (ResponseEntity<CaseOutlineHeader>) result;




            result = etisLog.trasactionDetail().toString()+" "+returnValue.getBody().getCode().toString();



        } catch (IllegalArgumentException e) {
            throw e;
        }
    }

The class CaseOutlineHeader is what I want to be changed. the parameterTypes variable contains the name of the class that I would like to pass inside the tag of the ResponseEntity<>. What if I would like to pass a different class Name. How should I do that to be flexible to accept the different class name?

If i do : ResponseEntity<parameterTypes> returnValue = (ResponseEntity<parameterTypes>) result;

it will say an error parameterTypes cannot be resolved to a type.

Upvotes: 0

Views: 1435

Answers (2)

Klaus Groenbaek
Klaus Groenbaek

Reputation: 5035

The problem is that your AOP method need to cast the result to something in order to get the code value it needs to log. That something must be known in advance, since you can't use type parameters in annotations, and therefore can't pass it to AOP methods. This means that all methods you access in AOP must come from a known interface, like this:

public interface LogCodeProvider {
    String getLogCode();
}

public class CaseOutlineHeader implements LogCodeProvider {
    @Override
    public String getLogCode() {
        return "My Code";
    }
}

And then in your AOP method you can do like this:

@SuppressWarnings("unchecked")
ResponseEntity<LogCodeProvider> returnValue = ResponseEntity<LogCodeProvider>) result;

result = etisLog.trasactionDetail().toString()+" "+returnValue.getBody().getLogCode();

In my example I have implemented special method getLogCode() which returns a string, so each class can decide exactly what to output.

It does however look confusing to reuse the result variable to store the value returned from etisLog.trasactionDetail().

Upvotes: 2

Amit Kumar Lal
Amit Kumar Lal

Reputation: 5789

Below sample code ,

   ResponseEntity<?> anyRandomMethod(){
    if(any condition){
      return new ResponseEntity<Animal>(new Animal(), httpstatus.OK);
    }else{
      return new ResponseEntity<SpaceShip>(new SpaceShip(), httpstatus.OK);
    }

    }

Upvotes: 0

Related Questions