2015-07-22 8 views
0

Весной MVC. Я могу использовать WebRequest как параметр, который будет автоматически установлен (наряду с другими вещами, такими как Locale и т. Д.).WebRequest на объекте @RequestBody

Я также использую @RequestBody для передачи в объекте JSON, который описывает, что и как следует извлекать данные.

Можно ли получить Spring автоматически установить WebRequest непосредственно на @RequestBody объекта EntriesRequestDTO (я хотел бы сделать WebRequest поле на EntriesRequestDTO). Это позволило бы мне скрыть некоторую сложность, так как мне часто нужно получить атрибут от WebRequest.

@RequestMapping(value = "/entries", method = { RequestMethod.POST }) 
    public EntriesDTO getEntries(@RequestBody EntriesRequestDTO request, WebRequest webRequest){ 
    ... 
} 
+0

Очень короткий ответ: * no *. Конечно, с созданием собственного конвертера/расширением «ObjectMapper» вы можете делать все, что хотите, но это потребует некоторой сложности. Но зачем вам это нужно, чтобы не все данные были уже в JSON? –

+0

Мне нужно получить доступ к атрибуту, установленному фильтром ранее в запросе. – smox

+0

Тогда почему бы просто не восстановить его один раз и установить его на DTO самостоятельно. Должно быть одноразовое действие. –

ответ

0

Я закончил создание пользовательского HttpMessageConverter. Это не очень общее решение, но это работает для меня:

@Configuration 
public class WebConfiguration extends WebMvcConfigurationSupport { 
    @Bean 
    public DTOJackonMessageConverter customJackson2HttpMessageConverter() { 
     return new DTOJackonMessageConverter(); 
    } 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     converters.add(customJackson2HttpMessageConverter()); 
     super.addDefaultHttpMessageConverters(converters); 
    } 
} 

DTOJacksonMessageConverter расширяет MappingJackson2HttpMessageConverter и переопределяет чтения метод.

0

Вы можете использовать АОП для установки WebRequest в DTO

@Around("execution(* (com.your.company..*).*(..))") 
public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable { 
    final Object[] args = joinPoint.getArgs(); 
    //get args[0] and args[1] 
    return joinPoint.proceed(); 
} 

Убедитесь, что регулярное выражение правильно (или добавить пользовательскую аннотацию), проверьте исключения актеров.

+0

Благодарим вас за предложение. Я не знаком с аспектно-ориентированным программированием. Поэтому я пошел с «более простым» решением, по крайней мере, для меня. – smox