【问题标题】:How to dynamically choose output parameter type in Spring MVC REST controller methods如何在 Spring MVC REST 控制器方法中动态选择输出参数类型
【发布时间】:2014-06-30 09:25:27
【问题描述】:

我有一个 Spring MVC 应用程序,它使用两个 REST 方法从服务器获取 Person,或允许某人远程注册。两种方法都接受JSON 并返回它。从JSONJSON 的转换在应用程序的DispatcherServlet 中处理。

这两种方法是:

// Gets a Person via REST.
@RequestMapping(value="/person/{personId}", method=RequestMethod.GET)
public @ResponseBody Person getPerson(@PathVariable("personId") String personId) {
    logger.info(RestController.class.getName() + ".getPerson() method called."); 

    return personService.get(Integer.parseInt(personId));        
} 

// Allows a new Person to register via REST.
@RequestMapping(value="/register", method=RequestMethod.POST)    
public @ResponseBody Person postRegister(@RequestBody Person person, 
                                         BindingResult bindingResult) {    
    logger.info(RestController.class.getName() + ".postRegister() method called."); 

    // Validate Person.
    personValidator.validate(person, bindingResult);
    if (bindingResult.hasErrors()) {

        /* NOTE: Messages object to be returned here. */

            List<ObjectError> errors = bindingResult.getAllErrors();            
            for (ObjectError error : errors) { 
                System.out.println(messageSource.getMessage(error.getCode(), null, null));            
            }
            return person;

    } 
    else {                       
        personService.insert(person);                                     
        return person;        
    }
}    

如果没有验证错误,这些都可以很好地工作。但在postRegister 方法中,如果出现验证错误,我想向客户端返回一个简单的Messages 对象,如下所示:

public class Messages {

private List<String> messages;

public Messages() { 
    messages = new ArrayList<String>();
}

然后可以将其转换为JSON

所以我的问题变成了处理方法返回类型的问题。对于成功的操作,我希望每个方法都返回一个Person,但在失败的情况下,每个方法都应该返回一个Messages 对象。

除了让这两种方法都返回一个通用的Object 之外,有没有一种简单的方法可以做到这一点 可以实现?

【问题讨论】:

    标签: rest spring-mvc parameters bean-validation


    【解决方案1】:

    如果BindingResult 出现错误,您可以抛出异常,然后为该方法使用专用的@ExceptionHandler 来返回消息:

    @ExceptionHandler(YourValidationException.class)
    public Messages handleIOException(ValidationException ex) {
    
        // Build up messages from BindingResult contained in the Exception
        return messages;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      相关资源
      最近更新 更多