Использование перехватчика для входа в службу REST, но не удается записать запрос и ответ - PullRequest
0 голосов
/ 16 мая 2018

У меня есть служба REST, и я хочу зарегистрировать запрос и ответ. Они получают запрос JSON и генерируют другой ответ JSON. Я создал перехватчик, но не могу получить тело запроса / ответа. Это моя конфигурация cxf:

<bean id="ContextInInterceptor" class="main.interceptors.ContextMessageInInterceptor"></bean>
<bean id="ContextOutInterceptor" class="main.interceptors.ContextMessageOutInterceptor"></bean>
<bean id="ContextJSONInInterceptor" class="main.interceptors.ContextJSONInInterceptor"></bean>
<bean id="ContextJSONOutInterceptor" class="main.interceptors.ContextJSONOutInterceptor"></bean>

<cxf:bus>
   <cxf:features>
      <cxf:logging/>
   </cxf:features>

   <cxf:inInterceptors>
      <ref bean="ContextInInterceptor"/>
   </cxf:inInterceptors>
   <cxf:outInterceptors>
      <ref bean="ContextOutInterceptor"/>
   </cxf:outInterceptors>
</cxf:bus>

А это мой код перехватчика:

public class ContextMessageInInterceptor extends AbstractPhaseInterceptor<org.apache.cxf.message.Message> {

       @Autowired
       ContextJSONInInterceptor contextJSONInInterceptor;

       public ContextMessageInInterceptor() {
           super(Phase.PRE_INVOKE);
       }

       @Override
       public void handleMessage(Message message) {
           contextJSONInInterceptor.handleMessage(message);
       }
}

public class ContextJSONInInterceptor extends AbstractPhaseInterceptor<Message> {

    public ContextJSONInInterceptor() {
        super(Phase.PRE_INVOKE);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        System.out.println("Content-Type: " + message.get(Message.CONTENT_TYPE));
        System.out.println(message.toString());
        System.out.println("---------------");
    }
}

public class ContextMessageOutInterceptor extends AbstractPhaseInterceptor<Message> {

    @Autowired
    ContextJSONOutInterceptor contextJSONOutInterceptor;

    public ContextMessageOutInterceptor() {
        super(Phase.WRITE);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        contextJSONOutInterceptor.handleMessage(message);
    }
}

public class ContextJSONOutInterceptor extends AbstractPhaseInterceptor<Message> {

    public ContextJSONOutInterceptor() {
        super(Phase.WRITE);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        System.out.println("Content-Type: " + Message.CONTENT_TYPE);
        System.out.println(message.toString());
        System.out.println("---------------");
    }

}

ContextMessageInInterceptor и ContextMessageOutInterceptor работают должным образом, и они идут к ContextJSONInInterceptor и ContextJSONOutInterceptor соответственно, но я не знаю, как получить тело запроса / ответа от этих перехватчиков. Я пытался использовать константы «Сообщение», и все, что я получаю, это тип контента.

Кто-нибудь знает, как получить тело запроса / ответа от этих перехватчиков?

Большое спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

У вас есть два варианта: с HandlerInterceptor вы можете видеть запросы и методы, с некоторым размышлением вы можете получить некоторую информацию, которая, возможно, это все, что вам нужно.

public class ApiInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    // code
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//code
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
   // code
    }
}

Второй вариант: Spring AOP (который может быть дополнительным). Вы можете использовать pointcut, который будет нацелен на все аннотации @RequestMapping(), и совет, который будет выполнен в нужный момент. Я задал (и ответил) вопрос об этом не так давно.

0 голосов
/ 16 мая 2018

Вместо перехватчиков, АОП будет хорошим вариантом. Вы можете применить его к методам вашего контроллера, где проходит трафик запросов / ответов. И для получения объекта запроса в этой области запроса вы можете сделать что-то вроде:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
            .getRequest();
...