我有以下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]",
虽然如上所述,问题是正确的,但信息是错误的。那么,为了产生想要的错误而不是杰克逊产生的错误,我们能做些什么呢?
在控制器中使用以下代码。
@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