【发布时间】:2019-09-10 11:45:21
【问题描述】:
提前感谢您的支持。 目前我陷入了下一个问题。我开发了一个 Aspect 类来验证来自 RestController 的 pkg 的输入 JSON。 符合一定的特点。 我的控制器的每个方法都返回一个不同的 DTO 对象。 当我的逻辑未实现时,我创建了一个新的通用对象以从我的方面返回它。当我进行测试时,我收到了一个错误,即 CannotCastClass "xxxxDTO" 到 newErrorResponseDTO。 目前我已经可以获取方法签名或对象类型。我的想法是将返回类型(来自 methodSignature)转换为我的新 DTOResponse。对象响应总是不同的。 我提到整个项目的架构和设计已经开发完毕。我只做了方面 目前,我还没有成功。 我附上证据。谢谢
我尝试了 ResponseAdvice,以及多种投射对象的方法。 我更喜欢留在方面。我得到的解决方案将控制器中的所有响应 DTO 更改为 Object generic。假设这样做是不好的做法,我更喜欢真正的解决方案
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Arrays;
// Other imports missing...
@Aspect
@Component("validateParameterAspect")
public class ValidatorParameterAspect {
public static final Logger logger = Logger.getLogger(ValidatorParameterAspect.class);
@Autowired
ServiciosRest servicio;
@Pointcut("execution(* com.actinver.rest.*.* (..))")
public void executeController() {}
@Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
public void logRequestMapping() {}
@Around("logRequestMapping() && executeController() && args(..,@RequestBody requestBody) ")
public Object logRequestBody(ProceedingJoinPoint joinPoint, Object requestBody) throws Throwable {
String vlDataDecrypt = "";
try {
// output = joinPoint.proceed();
System.out.println("--------------123------------");
logger.warn("Entering in Method : " + joinPoint.getSignature().getName());
logger.warn("Class Name : " + joinPoint.getSignature().getDeclaringTypeName());
logger.warn("Arguments : " + Arrays.toString(joinPoint.getArgs()));
logger.warn("Target class : " + joinPoint.getTarget().getClass().getName());
SimpleJSONDataContainer args = (SimpleJSONDataContainer) joinPoint.getArgs()[0];
MethodSignature sign = (MethodSignature) joinPoint.getSignature();
Class<?> ret = sign.getReturnType();
String returnString = sign.getReturnType().getName();
logger.warn("Signature : " + ret);
vlDataDecrypt = AESHelper.decrypt(servicio.getSeedWord(), args.getData());
logger.info(" Decrypt -> " + vlDataDecrypt);
logger.info("args " + args.getData());
ErrorDataResponse res = validDataEmpty(args.getData());
if (res.getResult() == "2") {
return res; // or cast Class<?>
//return ret.cast(res);
}
} catch (Exception e) {
logger.error("Stack trace -> ", e);
}
return joinPoint.proceed();
}
public ErrorDataResponse validDataEmpty(String vlDataDecrypt) {
ErrorDataResponse errorDto = new ErrorDataResponse();
if (vlDataDecrypt == null || vlDataDecrypt.hashCode() == "77631826690E45839D7B49B932CBC81B".hashCode()
&& vlDataDecrypt.equalsIgnoreCase("77631826690E45839D7B49B932CBC81B")) {
errorDto.setResult("2");
errorDto.setMensaje(RestValidatorUtil.EnumErrors.ERROR_INPUT.getMsg());
logger.info("JSON null" + errorDto.getResult());
return errorDto;
}
return errorDto;
}
}
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
// Other imports missing...
@RestController
@RequestMapping("inicio")
public class Bursanet {
public final static Logger logger = Logger.getLogger(Bursanet.class);
@RequestMapping(
value = "cashByDate",
method = { RequestMethod.GET, RequestMethod.POST },
consumes = "application/json",
produces = "application/json"
)
public CashByDateDTO cashByDate(
@RequestBody SimpleJSONDataContainer simpleJSONDataContainer,
Authentication authentication
) {
String vlDataDecrypt = "";
CashByDateDTO outJson = new CashByDateDTO();
CashByDateRequest request = null;
try {
UsernamePasswordAuthenticationToken userPasswordAuthenticationToken =
(UsernamePasswordAuthenticationToken)
((OAuth2Authentication) authentication).getUserAuthentication();
//////example
return outJson;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
【问题讨论】:
-
欢迎来到 SO。我修复了缩进并稍微调整了代码格式,将代码拆分为每个类的一个块,还添加了一些导入。在您切断
try块之后,我还添加了一个虚拟catch块。至少现在代码更具可读性。你问的对我来说仍然是个谜,你可以编辑问题中的散文吗?如果我发现我会尝试回答,必须再次阅读。文字太乱了,抱歉,无意冒犯。
标签: spring aspectj spring-aop