Я работаю с Spring Framework
4.3.3 в веб-среде.
У меня есть @Controller
, используемый для Web
запросов через Web Browser
, который использует зависимость от других @Controller
, но для Rest
целей. Последнее упоминание использует @Service
и т.д....
Этот подход к «Интернету» с использованием «Отдых», как зависимость объясняется в Согласование содержимого с использованием Spring MVC для раздела Combining Data and Presentation Formats
. Пока здесь для разработки/тестирования и производства все работает нормально. Это ценный подход.
Примечание Класс Rest
имеет аннотацию @Controller
, потому что я работаю с ResponseEntity<?>
и @ResponseBody
.
Проблема с AOP
О своей инфраструктуре у меня есть:
@Configuration
@EnableAspectJAutoProxy
public class AopConfig {
}
О @Controller
s У меня есть два класса:
PersonaDeleteOneController
with:deleteOne(@PathVariable String id, Model model)
for@GetMapping
deleteOne(@PathVariable String id, RedirectAttributes redirectAttributes)
за@DeleteMapping
PersonaRestController
deleteOne(@PathVariable String id)
for@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
(Интернет) ->@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(...)
. - person Sergey Bespalov   schedule 28.09.2016Alpha
. Спасибо. - person Manuel Jordan   schedule 28.09.2016