我有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)
答案 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;
}