2017-02-26 7 views
0

Es ist eine Feder Boot-Anwendung, habe ich AOP http Kopf zu fangen, kann body.I für @annotation etwas tun, wenn Fang Wert von http Kopf, Körper.Allerdings, wenn ich tranfer Daten zu meinen kundengebundenen Parametern, kann ich nicht bekommen. aber eine andere Federbootanwendung kann es übertragen. Ich weiß nicht warum.Frühling AOP kann nicht übertragen Wert angepasst Parameter

dies wird besonders angefertigt @Aspect:

@Component 
@Aspect 
public class ApiAspect { 
@Resource 
private HttpServletRequest request; 

@Around("@annotation(com.jvbaoji.api.common.ApiAuth)") 
public Object aroundAdvice(ProceedingJoinPoint point) throws Throwable { 
    Long userId = Optional.ofNullable(request.getHeader("user_id")).map(Long::valueOf).orElse(null); 
    final MethodSignature signature = (MethodSignature) point.getSignature(); 
    final Method method = signature.getMethod(); 
    final String methodName = method.getName(); 
    final Class<?>[] parameterTypes = method.getParameterTypes(); 
    final Annotation[][] parameterAnnotations; 
    parameterAnnotations = point.getTarget().getClass().getMethod(methodName, parameterTypes).getParameterAnnotations(); 
    final Object[] args = point.getArgs(); 
    for (int i = 0; i < args.length; i++) { 
     for (Annotation annotation : parameterAnnotations[i]) { 
      if (AuthUserId.class.equals(annotation.annotationType())) { 
       args[i] = userId; 
       break; 
      } 
     } 
    } 
    return point.proceed(); 
} 
} 

angepasst @interface:

@Target({ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ApiAuth { 
} 

Parameter:

@Target({ElementType.PARAMETER}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface AuthUserId { 
} 

Controller:

@RequestMapping(value = "updateAccount", method = RequestMethod.POST) 
@ApiAuth 
public JsonNode updateAccount(@AuthUserId Long userId, @ModelAttribute UserAccountVO userAccountVO) { 
    userAccountVO.setUserId(userId); 
    TransmissionResult result = userWalletService.updateAccount(userAccountVO); 
    if (!result.isSuccess()) { 
     return responseJsonFactory.createBad(result.getCode(), result.getFailReason()); 
    } 
    return responseJsonFactory.createOk(jsonMapper.convertValue(userAccountVO, JsonNode.class)); 
} 

Ich habe gefunden, wenn ich http, kann ich debuggen zu arg[i]=userId, aber um point.proceed() zurückgeben, wirft es eine NullException.My @AuthUserId Long userId kann nicht erhalten Wert. Ich weiß nicht warum.

ps: Mein Frühling AOP-Version ist feder AOP-4.1.4.RELEASE.jar im Frühjahr Boot.

Dank, was Beratung Wenn Sie geben.

+0

Genau so, wie Sie richtig zu verstehen, bevor er antwortete: a) Sie sind sich der Tatsache bewusst, dass der Aspekt ein Singleton ist und damit die eingespritzte Anfrage wird immer gleich sein? b) Nach dem, was ich sehe, ist mein Eindruck, dass der Zweck des Aspekts darin besteht, Benutzerautorisierung zu hacken. Dann hoffe ich, dass Sie rechtliche Gründe dafür haben. Können Sie das bitte kurz kommentieren? – kriegaex

+0

NoNoNo.It ist meine Anwendung, ich weiß nicht, wie man Benutzerautorisierung hackt. Ich bekomme nur userId in meiner Anwendung für mein Projekt.jedoch bekomme ich immer noch keine. – Hanawa

Antwort

0

OK, es ist meine Unwissenheit ... Ich vermisste args hinzufügen, um fortzufahren.

In ApiAspect.class:

return point.proceed(); 

zu

return point.proceed(args); 
Verwandte Themen