如何处理requestbody从枚举设置有效值?

时间:2018-07-05 15:22:45

标签: java spring enums controller request

我有DB,其中包含名称,姓氏和年龄。我有一个单独的枚举类,名称例如“亚历克斯”,“彼得”,“邓肯”

我有一个API,可以通过请求正文中的有效负载更改名称

@RequestMapping(value = "/{userId}/name", method = RequestMethod.PUT)
    @ResponseStatus(HttpStatus.OK)
    public JsonView changeName(@Valid @RequestBody NameDTO nameDTO)
        throws Exception
    {
        _service.changename(getUser(),nameDTO.getName);
        return JsonView.EMPTY_VIEW;
    }

我的ENUM班

public enum Name
{
    ALEX("alex")
    PETER("peter")
    DUNCAN("duncan")
}

我的NameDTO班

public class NameDTO
{
    private String name;

    public NameDTO()
    {
    }

    @JsonProperty("name")
    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public NameDTO(String name)
    {
        this.name = name;
    }
}

所以我想做一些处理程序,如果我将在请求正文中以JSON发送与我从ENUM类得到的值不同的东西,则会得到400错误

JSON正文

    {
       "name": "Alex"
    }

好的,数据库使用此名称更新

    {
       "name": "David"
    }

应该给400(现在给500)

2 个答案:

答案 0 :(得分:0)

我了解的是,您想将ENum值的字符串表示形式存储在数据库中,如果它的值错误,则应该抛出错误。

这应该有效,

public class NameDTO
{

    private Name name;

   @JsonDeserialize(using = NameDeSerializer.class)
   public void setName(Name name)
   {
      this.name = name;
   }

}

@Component
public class NameDeSerializer extends JsonDeserializer<Name> {

@Override
public Name deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException {
    if (jp.getCurrentToken().equals(JsonToken.VALUE_STRING)) {
        try {
            return Name.valueOf(jp.getText());
        } catch (IllegalArgumentException e) {
            throw new CustomException(String.format("Invalid value for Name %s", jp.getText()));
        }
    }
    return null;
}


@Override
public Class<Name> handledType() {
    return Name.class;
}

}

抛出 400 状态代码的异常处理程序

@RestControllerAdvice
@RequestMapping(produces = "application/json")
public class DefaultExceptionHandler extends ResponseEntityExceptionHandler {

   @ExceptionHandler(value = { CustomException.class })
    protected ResponseEntity<Object> handleCustomError(CustomExceptionex, WebRequest request) {
        String bodyOfResponse = ex.getErrorMessage();
        return handleExceptionInternal(ex, new FusionExceptionResponse(HttpStatus.BAD_REQUEST.value(), bodyOfResponse),
                new HttpHeaders(), HttpStatus.BAD_REQUEST, request);
    }
}

所以

PUT /用户ID /名称{   “名称”:“大卫” }

首先点击 NameDeSerializer 并检查其值。它将在try块上引发 CustomException 异常。现在, DefaultExceptionHandler 将处理 CustomException ,并抛出 400 错误代码。

答案 1 :(得分:0)

所以我做了这样的事情

我已经创建了静态枚举列表

private static final List<String> NAME = Arrays.asList(
        Name.ALEX.toString(),
        Name.PETER.toString(),
        Name.DUNCAN.toString();

在执行服务方法之前简单地检入控制器

if (!Name.contains(nameDTO.getName)
{
throw new Exception;
}