当前位置: 首页 > 知识库问答 >
问题:

在JSON反序列化期间引发自定义错误

穆建华
2023-03-14

我有以下POJO:

@Entity // This tells Hibernate to make a table out of this class
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;


    private String name;

    private String email;

    private String username;

    private String password;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) throws DataFormatException {
        if(name.equals(""))
        {
            throw new DataFormatException("Mpla Mpla");
        }
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {

        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @JsonCreator
    public User(@JsonProperty("name") String name, @JsonProperty("email") String email,@JsonProperty("username") String username,@JsonProperty("password") String password) throws DataFormatException {
        setName(name);
        this.email = email;
        this.username = username;
        this.password = password;
}
    } 

以及以下控制器:

public class MainController {
    @Autowired // This means to get the bean called userRepository
    // Which is auto-generated by Spring, we will use it to handle the data
    private UserRepository userRepository;
    }
    @PostMapping(path="/add") // Map ONLY POST Requests
    public @ResponseBody String addNewUser (@RequestBody @Valid User user1) {
        // @ResponseBody means the returned String is the response, not a view name

        userRepository.save(user1);
        return "Saved";
    }

    @GetMapping(path="/all")
    public @ResponseBody Iterable<User> getAllUsers() {
        // This returns a JSON or XML with the users
        return userRepository.findAll();
    }

问题在于,它不是生成错误DataFormatException,而是生成:

"exception": "org.springframework.http.converter.HttpMessageNotReadableException",
    "message": "JSON parse error: Can not construct instance of hello.Users.User, problem: Mpla Mpla; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of hello.Users.User, problem: Mpla Mpla\n at [Source: java.io.PushbackInputStream@7604dc21; line: 6, column: 1]",

虽然如上所述,问题是正确的,但信息是错误的。那么,为了产生想要的错误而不是杰克逊产生的错误,我们能做些什么呢?

共有1个答案

薛征
2023-03-14

在控制器中使用以下代码。

@RequestMapping(value = "/user/register", method = RequestMethod.POST)
    public SecurityToken register(@RequestBody @Valid SecurityUser user, BindingResult result) {
        List<ObjectError> st = result.getAllErrors();
        String errorFields = "";
        for (ObjectError error : st) {
            errorFields = errorFields + error.getDefaultMessage();
        }
        if (!errorFields.equals("")) {
            throw new CustomException(errorFields);
        }
        return service.register(user);
    }

可以对字段使用注释,如下所示:

import org.hibernate.validator.constraints.NotEmpty;

public class SecurityUser {

    @NotEmpty(message = "Email id is mandatory.")
    private String emailId;

对于异常处理,可以在spring controller或ControllerAdvice中使用HandlerMethod。

@ControllerAdvice
public class SecurityControllerAdvice {

    @ExceptionHandler(CustomException.class)
    @ResponseBody
    public CustomResponse handleSecurityException(CustomException se) {
        CustomResponse response = new CustomResponse(se.getMessage());
        return response;
    }
}
 类似资料:
  • 问题内容: 我正在使用Flickr API 。调用该方法时,默认的JSON结果为: 我想将此响应解析为Java对象: JSON属性应按以下方式映射: 不幸的是,我无法找到一种使用Annotations做到这一点的好方法。到目前为止,我的方法是将JSON字符串读入a 并从中获取值。 但是我认为,这是有史以来最不优雅的方式。有没有简单的方法,可以使用注释还是自定义反序列化器? 这对我来说将是很明显的,

  • 我试图用Jackson库创建复杂类的对象。每个对象都有一个模式,反序列化器需要使用该模式来解释JSON。我的问题是如何向反序列化器提供模式? 反序列化程序扩展了类JSONDeserializer,该类具有无参数构造函数和必须重写的抽象方法反序列化(解析器、上下文)。我想改用另一种方法反序列化(解析器、上下文、值),其中值是部分构造的对象,其中包括模式。也就是说,反序列化方法可以调用value。sc

  • 问题内容: 我正在使用spring-webflux WebClient (内部版本20170502.221452-172)访问Web应用程序,该Web应用程序生成Entry对象流(application / stream + json),如下所示: 尽管Entry对象的反序列化对于使用标准通用类型(包括Java时间(JSR-310)数据类型,如java.time.Instant)的POJO都可以正

  • 我正在使用spring-webflux WebClient(build 20170502.221452-172)访问一个Web应用程序,该应用程序生成一个条目对象流(application/stream+JSON),如下所示: 虽然条目对象的反序列化对于使用标准通用类型(包括Java.time.instant等Java time(JSR-310)数据类型)的POJO很好,但我想知道,为了将任何自定

  • 问题内容: 有没有一种方法/库可以让我像GSON自定义序列化程序一样自定义JSON序列化? 这是我想要得到的: 此对象: KeyValuePair(“ Age”,10)myAge 通常会像 “ myAge”:{“ Key”:“ Age”,“ Value”:10} 同时我希望它进行序列化,例如: “年龄”:10 。有任何想法吗? 问题答案: 首先,我建议使用newton json dll。 其次,您

  • 我想反序列化表单中的类: 其中文本是加密的,反序列化应该在重建TestFieldEncryptedMessage实例之前取消对值的加密。 我采用的方法非常类似于:https://github.com/codesqueak/jackson-json-crypto 也就是说,我正在构建一个扩展SimpleModule的模块: 如您所见,设置了两个修饰符:EncryptedSerializerModif