Как мы можем реализовать операцию put с помощью dropwizard

#java #dropwizard

#java #dropwizard

Вопрос:

Я попытался поискать в Интернете примеры, использующие метод put rest, который похож на пример dropwizard на github, но я действительно не нашел ни одного.

вот мой PersonDAO.java код

 public class PersonDAO extends AbstractDAO<Person> {
    public PersonDAO(SessionFactory factory) {
        super(factory);
    }
    public Optional<Person> findById(Long id) {
        return Optional.fromNullable(get(id));
    }

    public Person create(Person person) {
        return persist(person);
    }

    public List<Person> findAll() {
        return list(namedQuery("com.example.helloworld.core.Person.findAll"));
    }
    //here i want to create delete method
}
  

вот мой код rest api:

 @Path("/people")
@Produces(MediaType.APPLICATION_JSON)
public class PeopleResource {

    private final PersonDAO peopleDAO;

    public PeopleResource(PersonDAO peopleDAO) {
        this.peopleDAO = peopleDAO;
    }

    @POST
    @UnitOfWork
    public Person createPerson(Person person) {
        return peopleDAO.create(person);
    }

    @GET
    @UnitOfWork
    public List<Person> listPeople() {
        return peopleDAO.findAll();
    }

    @GET
    @Path("/{id}")
    public Optional<Person> getUser(@PathParam("id") Integer id) {
        Optional<Person> person = peopleDAO.findPeopleById(id);
        return person;
    }
    //here should be put method that calls dao class
}
  

вот мой person.java класс

 @Entity
@Table(name = "people")
@NamedQueries(
    {
        @NamedQuery(
            name = "com.example.helloworld.core.Person.findAll",
            query = "SELECT p FROM Person p"
        )
    }
)
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "fullName", nullable = false)
    private String fullName;

    @Column(name = "jobTitle", nullable = false)
    private String jobTitle;

    public Person() {
    }

    public Person(String fullName, String jobTitle) {
        this.fullName = fullName;
        this.jobTitle = jobTitle;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    public String getJobTitle() {
        return jobTitle;
    }

    public void setJobTitle(String jobTitle) {
        this.jobTitle = jobTitle;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof Person)) {
            return false;
        }

        final Person that = (Person) o;

        return Objects.equals(this.id, that.id) amp;amp;
                Objects.equals(this.fullName, that.fullName) amp;amp;
                Objects.equals(this.jobTitle, that.jobTitle);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, fullName, jobTitle);
    }
}
  

Есть ли какие-либо простые способы / предложения по реализации метода put?

Комментарии:

1. Вы имеете в виду запрос put? Вы можете использовать аннотации @ Get, @ Post, @ Put, @ Delete над методом ресурсов, чтобы указать, какие операции он поддерживает. Есть ли ошибка, которую вы получаете при попытке?

Ответ №1:

ресурс:

 @PUT
public Person update(Person person) {
    return peopleDAO.update(person);
}
  

dao:

 public Person update(Person person) {
    return persist(person);
}
  

убедитесь, что ваш идентификатор не равен null. сохранение логики создания или обновления.

Комментарии:

1. Заменит ли это запись в базе данных? Например, если я использую запрос put и свой URL-адрес в localhost localhost:8080/people/2 , где two — основной идентификатор базы данных, обновит ли это вторую запись в базе данных?

2. ДА. если у вас нет никакого контроля. Для подобных состояний я использую столбец с аннотацией @Version. Например

3. @Version private long lastUpdated;