【发布时间】:2016-09-26 16:59:48
【问题描述】:
我在网络环境中使用Spring Framework 4.3.3。
我有一个@Controller 用于通过Web Browser 请求Web,该Web Browser 使用其他@Controller 的依赖关系,但用于Rest 目的。后者提到使用@Service 等...
这种关于使用“Rest”的“Web”的方法如何在Content Negotiation using Spring MVC 中为Combining Data and Presentation Formats 部分解释依赖关系。直到这里进行开发/测试和生产工作正常。这是一种有价值的方法。
注意Rest 类使用@Controller 进行注释,因为我使用的是ResponseEntity<?> 和@ResponseBody。
问题在于AOP
关于我拥有的基础设施:
@Configuration
@EnableAspectJAutoProxy
public class AopConfig {
}
关于@Controllers 我有这两个类:
-
PersonaDeleteOneController与:-
deleteOne(@PathVariable String id, Model model)为@GetMapping -
deleteOne(@PathVariable String id, RedirectAttributes redirectAttributes)为@DeleteMapping
-
-
PersonaRestController-
deleteOne(@PathVariable String id)为@DeleteMapping
-
这两个类在同一个包中声明:
com.manuel.jordan.controller.persona
我有以下@Pointcut:
@Pointcut(value=
"execution(* com.manuel.jordan.controller.*.*Controller.deleteOne(String, ..))
&& args(id) && target(object)")
public void deleteOnePointcut(String id, Object object){}
@Pointcut 用于以下建议:
@Before(value="ControllerPointcut.deleteOnePointcut(id, object)")
public void beforeAdviceDeleteOne(String id, Object object){
logger.info("beforeAdviceDeleteOne - @Controller: {} - Method: deleteOne - id: {}", object.getClass().getSimpleName(), id);
}
当我执行Rest 测试时,我可以通过打印以下模式的AOP + logging 进行确认:
-
@Controller(休息) ->@Service->@Repository
到这里为止,所有工作都按预期进行
当我执行Web 测试时,我可以通过打印以下模式的AOP + logging 进行确认:
-
@Controller(休息) ->@Service->@Repository
我需要或期望的是:
-
@Controller(Web) ->@Controller(休息) ->@Service->@Repository
有什么问题或遗漏? deleteOne 签名对它们的参数没有歧义。
生产的情况相同。
阿尔法
这里是控制器:
@Controller
@RequestMapping(value="/personas")
public class PersonaDeleteOneController {
private final PersonaRestController personaRestController;
@Autowired
public PersonaDeleteOneController(PersonaRestController personaRestController){
this.personaRestController = personaRestController;
}
@GetMapping(value="/delete/{id}",
produces=MediaType.TEXT_HTML_VALUE)
public String deleteOne(@PathVariable String id, Model model){
model.addAttribute(personaRestController.findOneById(id));
model.addAttribute("root", "/personas/delete");
return "persona/deleteOne";
}
@DeleteMapping(value="/delete/{id}",
produces=MediaType.TEXT_HTML_VALUE)
public String deleteOne(@PathVariable String id, RedirectAttributes redirectAttributes){
personaRestController.deleteOne(id);
redirectAttributes.addFlashAttribute("message", "process.successful");
return "redirect:/message";
}
}
和
@Controller
@RequestMapping(value="/personas")
public class PersonaRestController {
private final PersonaService personaService;
@Autowired
public PersonaRestController(PersonaService personaService){
this.personaService = personaService;
}
@DeleteMapping(value="/{id}")
public ResponseEntity<Void> deleteOne(@PathVariable String id){
personaService.deleteOne(id);
return ResponseEntity.noContent().build();
}
....
你怎么看我不使用this. 来执行方法调用。
【问题讨论】:
-
能否提供
@Controller类方法调用的代码示例?如果您尝试执行this.deleteOne(...)之类的操作,则可能会出现问题。 -
完成,请参阅
Alpha部分。谢谢。
标签: spring-mvc aop spring-aop spring-aspects