Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SpringREST控制器中获取原始JSON主体?_Java_Spring_Spring Boot_Spring Mvc - Fatal编程技术网

Java 如何在SpringREST控制器中获取原始JSON主体?

Java 如何在SpringREST控制器中获取原始JSON主体?,java,spring,spring-boot,spring-mvc,Java,Spring,Spring Boot,Spring Mvc,下面的API接受来自客户端的json字符串,并将其映射到电子邮件对象中。如何将请求正文(电子邮件)作为原始字符串获取?(我需要原始字符串和键入版本的email参数) 附:本问题并非重复: @PostMapping(value=“/mailssender”) 公共响应发送邮件(@RequestBody-Email){ //... 返回新的响应状态(HttpStatus.OK); } Spring在后面使用Jackson,您可以使用它将其序列化为字符串。像这样: @Autowired private

下面的API接受来自客户端的json字符串,并将其映射到电子邮件对象中。如何将请求正文(
电子邮件
)作为原始字符串获取?(我需要原始字符串和键入版本的
email
参数)

附:本问题并非重复:

@PostMapping(value=“/mailssender”)
公共响应发送邮件(@RequestBody-Email){
//...
返回新的响应状态(HttpStatus.OK);
}

Spring在后面使用Jackson,您可以使用它将其序列化为字符串。像这样:

@Autowired private ObjectMapper jacksonMapper;

@PostMapping(value = "/mailsender")
public ResponseEntity<Void> sendMail(@RequestBody Email email) {
    //...
    log.info("Object as String: " + jacksonMapper.writeValueAsString(email));
    return new ResponseEntity<>(HttpStatus.OK);
}
@Autowired私有对象映射器jacksonapper;
@PostMapping(value=“/mailsender”)
公共响应发送邮件(@RequestBody-Email){
//...
log.info(“对象为字符串:+jacksonMapper.writeValueAsString(电子邮件));
返回新的响应状态(HttpStatus.OK);
}

您可以使用GSON库创建字符串类型的
json

Gson-Gson=new-Gson();
@后期映射(value=“/endpoint”)
公共响应行动控制器(@RequestBody Car){
//...
log.info(“对象为字符串:+this.gson.toJson(car));
返回新的响应状态(HttpStatus.OK);
}

关于这个问题,我并没有完全了解,但我会尽我所能回答。好, 如果要获取请求正文,请执行以下操作:

  • 正如你在这里所说,我已经写下了如何做到这一点。如果出现问题,可能是您发送了错误的json,或者您在
    电子邮件中看到的类型不合适。也许你的请求来自url过滤器

  • 第二种方法是这样尝试:

    private final ObjectMapper mapper = new ObjectMapper();
    
    @PostMapping(value = "/mailsender")
    public ResponseEntity<Void> sendMail(HttpServletRequest req) {
        // read request body
        InputStream body = req.getInputStream();        
        byte[] result = ByteStreams.toByteArray(body);
        String text =new String(result,"UTF-8");
        //convert to object
        Email email = mapper.readValue(body, Email .class);
        return new ResponseEntity<>(HttpStatus.OK);
    }
    
    
    private final ObjectMapper mapper=new ObjectMapper();
    @PostMapping(value=“/mailsender”)
    公共响应发送邮件(HttpServletRequest请求){
    //读取请求正文
    InputStream body=req.getInputStream();
    字节[]结果=ByTestStreams.toByteArray(正文);
    字符串文本=新字符串(结果为“UTF-8”);
    //转换为对象
    Email Email=mapper.readValue(body,Email.class);
    返回新的响应状态(HttpStatus.OK);
    }
    

如果要将对象转换为json字符串,可以使用多种方法,如清单2所示

 1. **Taking string as the paramater**,
     @PostMapping(value = "/mailsender")
        public ResponseEntity<Void> sendMail(@RequestBody String email) {
            //... the email is the string can be converted to Json using new JSONObject(email) or using jackson.
            return new ResponseEntity<>(HttpStatus.OK);
        }

 2. **Using Jackson** 
         @PostMapping(value = "/mailsender")
            public ResponseEntity<Void> sendMail(@RequestBody Email email) {
                //...
                ObjectMapper mapper = new ObjectMapper(); 
                String email = mapper.writeValueAsString(email); //this is in string now
                return new ResponseEntity<>(HttpStatus.OK);
            }
1**以字符串为参数**,
@PostMapping(value=“/mailsender”)
public ResponseEntity sendMail(@RequestBody String-email){
//…电子邮件是可以使用新的JSONObject(电子邮件)或jackson将字符串转换为Json的字符串。
返回新的响应状态(HttpStatus.OK);
}
2. **使用Jackson**
@PostMapping(value=“/mailsender”)
公共响应发送邮件(@RequestBody-Email){
//...
ObjectMapper mapper=新的ObjectMapper();
String email=mapper.writeValueAsString(email);//现在是字符串
返回新的响应状态(HttpStatus.OK);
}

您是否尝试过使用toString或StringBuilder方法?确切地说,为什么它不是重复的?@chrylis小心光学-另一个问题是只获取原始字符串,而不关心输入(映射)的字符串版本parameter@kalpajagrawalla我想这会造成一些开销,由于我们必须将对象转换回JSON字符串,您是否尝试将两者都转换为JSON字符串?第一种方法是我现在使用的解决方案,但我希望Spring提供更好的方法来解决此问题。第一种方法:电子邮件是一个编码的表单字符串,由Spring修改
 1. **Taking string as the paramater**,
     @PostMapping(value = "/mailsender")
        public ResponseEntity<Void> sendMail(@RequestBody String email) {
            //... the email is the string can be converted to Json using new JSONObject(email) or using jackson.
            return new ResponseEntity<>(HttpStatus.OK);
        }

 2. **Using Jackson** 
         @PostMapping(value = "/mailsender")
            public ResponseEntity<Void> sendMail(@RequestBody Email email) {
                //...
                ObjectMapper mapper = new ObjectMapper(); 
                String email = mapper.writeValueAsString(email); //this is in string now
                return new ResponseEntity<>(HttpStatus.OK);
            }