发布请求后从服务器端发送ResponseEntity时,客户端出现JSON错误

时间:2018-07-03 11:23:34

标签: java spring spring-rest spring-web

我有一个angular / spring boot webapp。当我发送创建用户后期请求时,有角度的客户端应用程序无法读取我在操作后发回的响应实体的主体。错误是:

{error: SyntaxError: Unexpected token U in JSON at position 0 at JSON.parse (<anonymous>) at XMLHttp…, text: "User successfully created."}

我知道这是由于正文内容不是JSON格式引起的。但是,即使我将produces = "application/json"作为属性添加到@PostMapping批注中,错误仍然存​​在。

此处提供代码:

@RestController
@RequestMapping("api/user")
public class UserController {

    private final Log logger = LogFactory.getLog(this.getClass());

    @Autowired
    UserService userService;

    @Autowired
    UserDao userDao;

    @PostMapping(path = "/create", produces = "application/json")
    private ResponseEntity<String> createNewUser(@RequestBody UserCreateDTO newUser) {
        logger.info("name is: " + newUser.getUserName());
        Status status = userService.createUser(newUser);
        return ResponseEntity.status(status.isSuccess() ?
                HttpStatus.CREATED : HttpStatus.BAD_REQUEST).body(status.getInfo());
    }

我该怎么做才能解决此问题?我认为这与ResponseEntity的使用有关。我可以只发送回发的状态DTO对象,但是我也希望能够操纵发送回去的httpStatus代码,所以这就是为什么我要使用ResponseEntity的原因。

2 个答案:

答案 0 :(得分:0)

看起来您正在返回字符串文字而不是json对象。转换为json时返回的对象应类似于

{
  "status": "user created successfully"
}

尝试返回完整的status对象而不是status.getInfo(),则返回对象应类似于:

{
   "info": "user created successfully"
}

,您可以在JavaScript中调用status.info来引用退货

,并且必须将您的退货类型更改为RepsonseEntity<Status>

答案 1 :(得分:0)

事实上,是的,您使用ResponseEntity但正文为String,因为您使用的是:

.body(status.getInfo());

您需要在主体中指定一个对象,可以创建一个POJO,该POJO将为您保存消息,包装status.getInfo()字符串,并将其读取为JSON。

消息POJO类:

public class MessageObject {
    private String message;
    //Constructors, getter and setter
}

您的返回码为:

return ResponseEntity.status(status.isSuccess() ?
                HttpStatus.CREATED : HttpStatus.BAD_REQUEST).body(new MessageObject(status.getInfo()));