给定的 ID 不能为空!;嵌套异常为 java.lang.IllegalArgumentException

huangapple 未分类评论43阅读模式
英文:

The given id must not be null!; nested exception is java.lang.IllegalArgumentException

问题

我正在使用Spring Boot创建一个简单的CRUD应用所有功能都正常但在方法findOne(Long id)中遇到了一个小问题

在Postman中当我使用以下URLhttp://localhost:8080/api/user/id/?id=13 时,我收到以下异常:

"error": "Internal Server Error",
"exception": "org.springframework.dao.InvalidDataAccessApiUsageException",
"message": "The given id must not be null!; nested exception is java.lang.IllegalArgumentException: The given id must not be null!",

以下是我的代码

**Repository**

```java
@SuppressWarnings("unused")
@Repository
public interface UserRepository extends JpaRepository<Utilisateur, Long> {
}

Service

public interface UserService {
    Utilisateur save(Utilisateur utilisateur);
    List<Utilisateur> findAll();
    Utilisateur findOne(Long id);
}

ServiceImpl

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserRepository userRepository;

    public UserServiceImpl() {
    }

    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public Utilisateur save(Utilisateur utilisateur) {
        return userRepository.save(utilisateur);
    }

    @Override
    public List<Utilisateur> findAll() {
        return userRepository.findAll();
    }

    public Utilisateur findOne(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}

Controller

@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://localhost:4200", allowedHeaders = "*")
public class UserController {
    @Autowired
    private UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/users")
    public List<Utilisateur> getUsers() {
        return userService.findAll();
    }

    @GetMapping("/user/id/{id}")
    public ResponseEntity<Utilisateur> getUser(@PathVariable Long id) {
        Utilisateur utilisateur = userService.findOne(id);
        return ResponseEntity.ok().body(utilisateur);
    }

    @PostMapping("/user")
    public ResponseEntity<Utilisateur> saveUser(@RequestBody Utilisateur utilisateur) throws URISyntaxException {
        Utilisateur result = userService.save(utilisateur);
        return ResponseEntity.created(new URI("/api/user/" + result.getId()))
            .body(result);
    }

    @PutMapping("/user")
    public ResponseEntity<Utilisateur> updateUser(@RequestBody Utilisateur utilisateur) throws URISyntaxException {
        Utilisateur result = userService.save(utilisateur);
        return ResponseEntity.ok().body(result);
    }
}

<details>
<summary>英文:</summary>

i&#39;m creating a simple crud with spring boot. All function well but I have a little problem with the method findOne(Long id)&lt;br&gt;
in postman when i put this url : *http://localhost:8080/api/user/id/?id=13* , i get this exception : 

 

*&quot;**error**&quot;: &quot;Internal Server Error&quot;,&lt;br&gt;
 &quot;**exception**&quot;: &quot;org.springframework.dao.InvalidDataAccessApiUsageException&quot;,&lt;br&gt;
 &quot;**message**&quot;: &quot;The given id must not be null!; nested exception is* *java.lang.IllegalArgumentException: The given id must not be null!&quot;,*

here is my code :&lt;br&gt;
**Repository**&lt;br&gt;

    @SuppressWarnings(&quot;unused&quot;)
    @Repository
    public interface UserRepository extends JpaRepository&lt;Utilisateur, Long&gt; {
    }

&lt;br&gt;

**Service**&lt;br&gt;

    public interface UserService {
    
    	Utilisateur save(Utilisateur utilisateur);
    	List&lt;Utilisateur&gt; findAll();
    	Utilisateur findOne(Long id);
    }
**ServiceImpl**

    @Service
    public class UserServiceImpl implements UserService{
    	@Autowired
    	UserRepository userRepository;
    	
    
    	public UserServiceImpl() {
    	}
    	
    	public UserServiceImpl(UserRepository userRepository) {
    		this.userRepository = userRepository;
    	}
    	
    	@Override
    	public Utilisateur save(Utilisateur utilisateur) {
    		return userRepository.save(utilisateur);
    	}
    
    	
    
    
    	@Override
    	public List&lt;Utilisateur&gt; findAll() {
    		return userRepository.findAll();
    	}
    
    	public Utilisateur findOne(Long id) {
    		return userRepository.findOne(id);
    	}
    }
**Controller**

    @RestController
    @RequestMapping(&quot;/api&quot;)
    @CrossOrigin(origins=&quot;http://localhost:4200&quot;,allowedHeaders=&quot;*&quot;) 
    public class UserController {
    	@Autowired
    	private UserService userService; 
    	
    	public UserController(UserService userService) {
    		this.userService = userService;
    	}
    	
    	public UserController() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    
    	@GetMapping(&quot;/users&quot;)
    	public List&lt;Utilisateur&gt; getUsers() {
    		return userService.findAll();
    	}
    
    	@GetMapping(&quot;/user/id/{id}&quot;)
    	public ResponseEntity&lt;Utilisateur&gt; getUser(@PathVariable Long id) {
    		Utilisateur utilisateur = userService.findOne(id);
    		return ResponseEntity.ok().body(utilisateur);
    	}
    	
    
    	  
    	/*  
    	@DeleteMapping(&quot;/user/{id}&quot;)
    	public Boolean deleteUser(@PathVariable Long id) {
    		 userRepository.delete(id);
    		 return true;
    	} */
    	@PostMapping(&quot;/user&quot;)
    	public ResponseEntity&lt;Utilisateur&gt; saveUser(@RequestBody Utilisateur utilisateur) throws URISyntaxException {
    		Utilisateur result = userService.save(utilisateur);  
    		return ResponseEntity.created(new URI(&quot;/api/user/&quot; + result.getId()))
    		        .body(result);
    	}
    	
    
    	
    	@PutMapping(&quot;/user&quot;)
    	public ResponseEntity&lt;Utilisateur&gt; updateUser(@RequestBody Utilisateur utilisateur) throws URISyntaxException  {
    		Utilisateur result = userService.save(utilisateur);
    		return ResponseEntity.ok().body(result);
    	}
    }



</details>


# 答案1
**得分**: 0

你已将映射设置为URL路径变量

    @GetMapping("/user/id/{id}")

但是您尝试的URL具有查询参数:?id=13

请尝试使用:http://localhost:8080/api/user/id/13

这里是两者的一个很好的比较,详情请参阅[stackoverflow][1]。

  [1]: https://stackoverflow.com/questions/11552248/when-to-use-queryparam-vs-pathparam

<details>
<summary>英文:</summary>

You have your mapping set as a URL path variable

    @GetMapping(&quot;/user/id/{id}&quot;)

but the URL you tried has a query parameter: ?id=13 

Try using: http://localhost:8080/api/user/id/13

Here is a good comparison of the two on [stackoverflow][1]


  [1]: https://stackoverflow.com/questions/11552248/when-to-use-queryparam-vs-pathparam

</details>



# 答案2
**得分**: 0

URL有误。您在代码中将其设置为路径变量。在这种情况下,不应该在Postman中访问localhost:8080/api/user/id/?id=13,而应该访问localhost:8080/api/user/id/3,

但是如果您遵循REST标准,更好的URL应该是这样的(URL中不需要包含“id”)。localhost:8080/api/user/3

<details>
<summary>英文:</summary>

The URL is incorrect. You have set it up as a path variable in your code. In which case, instead of hitting localhost:8080/api/user/id/?id=13 in postman, you should hit localhost:8080/api/user/id/3 instead,


But if you were following REST standards, a better URL would look like this (no need to have the &quot;id&quot; in the URL). localhost:8080/api/user/3

</details>



huangapple
  • 本文由 发表于 2020年4月3日 23:35:06
  • 转载请务必保留本文链接:https://java.coder-hub.com/61015361.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定