2016-01-27 1 views
2

Позже Редактироватьпружина 4 перечислений как контроллер параметров

Случай я описал работает правильно. Проблема возникает, когда у меня есть что-то вроде этого на методе моего контроллера:

@RestController 
public class MyController { 
    @RequestMapping(...) 
    public void myMethod(@RequestBody MyForm myform) { ... } 
} 

public class MyForm { 
    private X x; 
    //setters and getters 
} 

Причина

Учитывая RequestBody, Spring будет использовать HttpMessageConverter десериализации ваше тело запроса в экземпляр ваш тип. В этом случае он будет использовать MappingJackson2HttpMessageConverter для JSON. Этот конвертер вообще не связан с PropertyEditorSupport.

Любые альтернативы? Мне нужно использовать @RequestBody в этом случае или найти способ поставить X в myform.


Я хочу поместить перечисление в качестве параметров внутри метода контроллера REST.

Это то, что у меня есть до сих пор.

Перечисление:

public enum X { 
    A("A"),B("B"),C("C"); 
    ... methods and constructors ... 
} 

Контроллер:

@RestController 
public class MyController { 
    @RequestMapping(...) 
    public void myMethod(@PathVariable("x") X x) { ... } 
} 

Конфигурация:

@ControllerAdvice 
public class GlobalControllerConfig { 
    @InitBinder 
    public void registerCustomEditors(WebDataBinder binder, WebRequest request) { 
     binder.registerCustomEditor(X.class, new XPropertyEditor()); 
    } 
} 

Свойство редактор:

public class XPropertyEditor extends PropertyEditorSupport { 
    @Override 
    public void setAsText(String text) { 
     try { 
      setValue(X.findByName(text)); 
     } catch (IllegalArgumentException e) { 
      throw new IllegalArgumentException("Custom binding failed. Input type: String. Expected type of value to be set: X", e); 
     } 
    } 

    @Override 
    public String getAsText() { 
     return ((X)getValue()).getName(); 
    } 
} 

Я поставил точку останова в своем @ControllerAdvice, и он проходит через это связывание каждый раз, когда запрос делается на любой из моих контроллеров. Это заставляет меня думать, что привязка правильная.

Когда я отправить запрос на мой метод, я получаю это, и я не понимаю, почему:

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not construct instance of ...X from String value 'A': value not one of declared Enum instance names: [A, B, C] 

Есть предложения?

+0

Как ваш запрос выглядеть как именно? – jannis

ответ

0

Попробуйте изменить @RequestVariable на @RequestParameter.

Я изменил бы setAsText метод такие строки:

@Override 
public void setAsText(String text) { 
    try { 
     String upperText = text.toUpperCase(); 
     X xResult = X.valueOf(upperText); 
     setValue(xResult); 
    } catch (IllegalArgumentException e) { 
     throw new IllegalArgumentException("Custom binding failed. Input type: String. Expected type of value to be set: X", e); 
    } 
} 
Смежные вопросы