2017-08-04 63 views
2

由于我使用的是CQRS模式,我试图创建一个单一的控制器方法,它接受每个POST调用并在其请求主体中发送一个命令。 我几乎在那里,但我无法获得路径变量。在Spring控制器方法中获取原始映射值

我创建了一个定制的HandlerMapping

@Bean 
public HandlerMapping requestMappingHandlerMapping() throws NoSuchMethodException { 
    for (final UrlEnum urlEnumItem : UrlEnum.values()) { 
     requestMappingHandlerMapping.registerMapping(new RequestMappingInfo(urlEnumItem.getCommandName(), 
         new PatternsRequestCondition(urlEnumItem.getUrl()), 
         null, 
         null, 
         null, 
         null, 
         null, 
         null), 
       commandController, 
       commandController.getClass().getDeclaredMethod("commandHandler", HttpServletRequest.class) 
     ); 
    } 
    return requestMappingHandlerMapping; 
} 

,这是我的控制器方法签名

@RequestMapping(method = {RequestMethod.POST, RequestMethod.PUT}, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) 
public ResponseEntity<Object> commandHandler(final HttpServletRequest request) throws Exception { 
    // controller code here 
} 

如果URL路径是一样的东西/api/test它的工作原理,但像/api/test/{idEntity}我不请求中有任何PathVariable可用。

我什么都试过像

String originalUrl = (String) request.getAttribute(
      HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE); 

它返回值的URL(即/api/test/1234),而不是模板,或添加

@PathVariable Map<String, Object> parameters 

在该方法的参数,它是空的。

调试请求对象似乎没有任何有用的标识路径变量。

也许我应该询问HandlerMapping,但我不能在控制器方法中访问它。

有没有办法在控制器方法中提取pathVariables?

回答

0

这是配置错误。我不应该将RequestMapping注释添加到控制器方法,因为它会覆盖我的配置。

现在我有

@RestController 
public class CommandController extends AbstractController { 

    private final MappingJackson2JsonView mappingJackson2JsonView = new MappingJackson2JsonView(); 

    @Override 
    protected ModelAndView handleRequestInternal(final HttpServletRequest request, final HttpServletResponse response) throws Exception { 
     // controller code here 
     return new ModelAndView(mappingJackson2JsonView); 
    } 
} 
相关问题