springboot 返回数据为null

SpringBoot中Jackson配置
本文介绍如何在SpringBoot项目中配置Jackson,以实现对JSON中null字段的处理。提供了两种方法:一是通过配置文件设置null字段不显示;二是将null字段转换为空字符串,并附带详细代码实现。

springboot默认使用jackson解析返回json数据。

处理方法1、返回json中的null字段-不显示 

配置文件添加 spring.jackson.default-property-inclusion=non_null 配置

处理方法2、返回json中的null字段-转为空字符串

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
 
import java.io.IOException;
 
/**
 * 处理 jackson 返回的null值
 * 返回json中的null值转为空字符串
 */
@Configuration
public class JacksonConfig {
 
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

 

### 如何在Spring Boot中正确地返回数据 #### 控制器层设计模式 为了确保应用程序具有良好的可维护性和扩展性,在控制器层应当遵循RESTful API的设计原则。每个HTTP请求应该映射到特定的方法上,这些方法负责接收参数、调用业务逻辑并最终形成响应对象。 对于JSON格式的数据交互来说,通常会创建专门用于传输的DTO(Data Transfer Object)类来封装要发送给客户端的信息[^1]。 ```java @RestController @RequestMapping("/api/v1/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public ResponseEntity<UserDto> getUserById(@PathVariable Long id){ User user = userService.findById(id); if (user != null){ return new ResponseEntity<>(new UserDto(user), HttpStatus.OK); }else{ throw new ResourceNotFoundException("User not found with id " + id); } } } ``` 这里展示了当GET请求访问`/api/v1/users/{id}`路径时,服务器端如何查找指定ID对应的用户记录,并将其转换成DTO实例后打包进ResponseEntity对象里一同返回给前端应用。 #### 错误处理机制 除了正常情况下返回的结果外,还需要考虑异常场景下的反馈方式。可以通过定义全局异常处理器的方式统一管理不同类型的错误情况,比如数据库操作失败或是找不到目标资源等情形下应该如何回应API消费者的需求[^2]。 ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ResourceNotFoundException.class) protected ResponseEntity<ErrorResponse> handleResourceNotFound( ResourceNotFoundException ex, WebRequest request) { ErrorResponse error = new ErrorResponse(404L,"Not Found",ex.getMessage()); return buildResponseEntity(error); } // Other exception handlers... private ResponseEntity<ErrorResponse> buildResponseEntity(ErrorResponse error) { return new ResponseEntity<>(error,error.getStatus(),HttpStatus.NOT_FOUND); } } ``` 上述代码片段说明了针对未找到资源的情况抛出了自定义异常`ResourceNotFoundException`, 并由全局异常捕获器捕捉住之后转化为结构化的错误信息传递回去。 #### 响应体构建工具——ResponseEntity<T> 使用`ResponseEntity<T>`可以更加灵活地控制HTTP响应的状态码以及头信息等内容。它允许开发者显式指明希望浏览器接收到的具体状态(如成功OK、重定向MOVED_PERMANENTLY 或者 客户端错误BAD_REQUEST),同时也支持设置额外的消息头部字段以便于前后端之间更丰富的沟通需求[^3]. ```java @PostMapping("") public ResponseEntity<String> createUser(@Valid @RequestBody UserCreateForm form, BindingResult bindingResult){ if(bindingResult.hasErrors()){ String errorMessage = getErrorMessage(bindingResult); return new ResponseEntity<>(errorMessage,HttpStatus.BAD_REQUEST); } try{ userService.save(form.toModel()); URI location = ServletUriComponentsBuilder.fromCurrentContextPath() .pathSegment("users","{userId}").buildAndExpand(/* userId */).toUri(); return ResponseEntity.created(location).body("User created successfully"); }catch(Exception e){ logger.error(e.getMessage(),e); return new ResponseEntity<>("Internal Server Error.",HttpStatus.INTERNAL_SERVER_ERROR); } } ``` 这段程序描述了一个POST接口用来新增用户的流程:先验证表单输入的有效性;如果存在校验错误则立即给出提示性的报错文案;接着尝试保存新实体至持久化存储之中;最后根据执行结果决定是告知对方已成功创建还是发生了内部问题而无法完成此次提交动作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值