Reputation: 123
I define UserController
and UserRepository
and User
like this
UserController.java
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.codec.Hex;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.zusn.domain.User;
import com.zusn.repository.UserRepository;
@RestController
@RequestMapping(value = "/user")
public class UserController {
@Autowired
private UserRepository userRepository;
@RequestMapping(value = "/create", method = RequestMethod.POST)
public User createUser(@RequestBody User newUesr) throws NoSuchAlgorithmException{
User user = userRepository.findByUidAndDevice(newUesr.getUid(), newUesr.getDevice());
if(user == null){
MessageDigest md = MessageDigest.getInstance("SHA");
Long now = System.nanoTime();
md.update(now.byteValue());
String random = RandomStringUtils.randomAlphabetic(32);
md.update(random.getBytes());
newUesr.setConsumerKey(String.valueOf(Hex.encode(md.digest())));
return userRepository.save(newUesr);
}else{
return user;
}
}
}
UserRepository.java
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import com.zusn.domain.Devices;
import com.zusn.domain.Providers;
import com.zusn.domain.User;
@Repository
public interface UserRepository extends JpaRepository<User, Long>{
/**
*
* @param uid UID
* @param provider Profider ex) twitter, google+, facebook
* @return User
*/
public User findByUidAndProvider(@Param("uid") String uid, @Param("provider") Providers provider);
/**
*
* @param uid UID
* @param devices Device ex) iOS, Android
* @return User
*/
public User findByUidAndDevice(@Param("uid")String uid, @Param("device") Devices device);
}
User.java
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;
@Column(name = "uid", nullable = false)
private String uid;
@Column(name = "provider")
private Providers provider;
@Column(name = "device", nullable = false)
private Devices device;
@Column(name = "consumer_key", nullable = false, unique = true)
private String consumerKey;
@OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY)
private Profile profile;
public User() {
super();
}
public User(String uid, Providers providers, String consumerKey) {
super();
this.uid = uid;
this.provider = providers;
this.consumerKey = consumerKey;
}
public String getConsumerKey() {
return consumerKey;
}
public void setConsumerKey(String consumerKey) {
this.consumerKey = consumerKey;
}
public User(Providers provider){
this.provider=provider;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public Providers getProvider() {
return provider;
}
public void setProvider(Providers provider) {
this.provider = provider;
}
public Profile getProfile() {
return profile;
}
public void setProfile(Profile profile) {
this.profile = profile;
}
public Devices getDevice() {
return device;
}
public void setDevice(Devices device) {
this.device = device;
}
}
When User is not existed, in other words handling first if
statement,this method returns new User
object. But when User is already existed, it returns status code 500.
And then it didn't print stacktrace when it returns 500 error.
So I'm not sure why it returns 500 error. Please tell me what is wrong this code and why it returns 500 error.
Upvotes: 2
Views: 2706
Reputation: 11571
Without the stacktrace it is hard to guess the problem. Maybe @NoOne is right but maybe you have an unique constrained in the database left from older developments.
If you don't see the stacktrace client side, you can put this snipped to get the stacktrace serverside. because the 5xx error is only telling that smth. went wrong on the server.
Upvotes: 1
Reputation: 31
First of all i think you may handle DataAccessException thrown by Spring Data JPA layer. For the 500 error i think it can be a problem of lazy loading. I think it is a different behaviour when you first insert the object entity in database. What server are you using ? Is it a tomcat ? If so how do you monitor your logs ? Depending on your configuration some logs are not visible in the standard catalina.out file. You need to check in localhost log file to see the stack trace.
Upvotes: 1