0

REST 呼び出しを使用して WebService を作成しました。

GET と DELETE の呼び出しはどちらも問題ありません。リソースを POST すると、Java メソッドは常に 2 回呼び出されます。また、リソースを PUT すると、PUT メソッドの後に POST メソッドが自動的に呼び出されます。

この問題を解決するために何をすればよいかわかりません。コード ドキュメントは次のとおりです。

まず、Spring DAO XML :

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.asefa.club.model" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="database" value="MYSQL" />
            <property name="showSql" value="true" />
            <property name="generateDdl" value="true" />
            <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
        </bean>
    </property>
</bean>

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost/asefa-core_club" />
    <property name="username" value="root" />
    <property name="password" value="" />
</bean>

<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<tx:annotation-driven transaction-manager="txManager" />

<context:annotation-config />

<bean id="clubDao" class="com.asefa.club.dao._impl.ClubDao" />

エンティティ Java クラス

@Entity
@NamedQueries({
@NamedQuery(name = "Club.getByName", query = "select c from Club c where c.nameShort = :name")})
public class Club implements Serializable {

@Id
@GeneratedValue
private long id;

private String name;
private String nameShort;
private String nameInitials;
private Date dateCreation;

@Lob
private byte[] picture;

@OneToOne
@JsonManagedReference
private Stadium stadium;

@OneToOne
@JsonManagedReference
private President president;

@OneToMany(mappedBy = "club", cascade = CascadeType.ALL)
@JsonManagedReference
private List<Team> teams;

@OneToMany(mappedBy = "club", cascade = CascadeType.ALL)
@JsonManagedReference
private List<Player> players;

@OneToMany(mappedBy = "club", cascade = CascadeType.ALL)
@JsonManagedReference
private List<Staff> staffs;

@OneToMany(mappedBy = "club", cascade = CascadeType.ALL)
@JsonManagedReference
private List<Trainer> trainers;

    // setters and getters
}

DAO Java クラス

public class ClubDao implements IClubDao {

@PersistenceContext
EntityManager entityManager;

public void createClub(Club club) {
    entityManager.persist(club);
}

public void updateClub(Club club) {
    entityManager.merge(club);
}

public void deleteClub(Club club) {
    Club c = getClub(club.getId());
    entityManager.remove(c);
}

public Club getClub(Long id) {
    return entityManager.find(Club.class, id);
}

@SuppressWarnings("unchecked")
public Club getClubByName(String name) {
    List<Club> clubs = entityManager.createNamedQuery("Club.getByName")
            .setParameter("name", name).getResultList();
    Club club = null;
    if (!clubs.isEmpty()) {
        club = clubs.get(0);
    }
    return club;
}

ビジネス Java クラス

@Transactional
public class ClubBo implements IClubBo {

private IClubDao clubDao;

public IClubDao getClubDao() {
    return clubDao;
}

@Autowired
public void setClubDao(IClubDao clubDao) {
    this.clubDao = clubDao;
}

public void postClub(Club club) throws ClubException {
    Club existingClub = getClubByName(club.getName());
    if (existingClub == null) {
        clubDao.createClub(club);
    } else {
        throw new ClubException("Club already exist", 1011);
    }
}

public void putClub(Club club) throws ClubException {
    Club existingClub = getClub(club.getId());
    if (existingClub != null) {
        clubDao.updateClub(club);
    } else {
        throw new ClubException("Club does not exist", 1012);
    }
}

public void deleteClub(Club club) throws ClubException {
    Club existingClub = getClub(club.getId());
    if (existingClub != null) {
        clubDao.deleteClub(club);
    } else {
        throw new ClubException("Club does not exist", 1012);
    }
}

public Club getClub(Long id) {
    return clubDao.getClub(id);
}

public Club getClubByName(String name) {
    return clubDao.getClubByName(name);
}
 }

最後に、CXF を使用した REST サービス (使用されるメソッドのみ)

@GET
@Path("/club/{clubName}")
@Produces(MediaType.APPLICATION_JSON)
public Club getClub(@PathParam("clubName") String clubName) {
    return coreClubApplication.getClub(clubName);
}

@POST
@Path("/club/{clubName}")
@Consumes(MediaType.APPLICATION_JSON)
public void createClub(@PathParam("clubName") String clubName,
        ClubJsonData clubJsonData) throws ClubException {
    Club club = new Club();
    club.setName(clubJsonData.getName());
    club.setNameShort(clubName);
    club.setNameInitials(clubJsonData.getNameInitials());
    club.setDateCreation(clubJsonData.getDateCreation());

    coreClubApplication.createClub(club);
}

@PUT
@Path("/club/{clubName}")
@Consumes(MediaType.APPLICATION_JSON)
public void updateClub(@PathParam("clubName") String clubName,
        ClubJsonData clubJsonData) throws ClubException {
    Club club = getClub(clubName);
    club.setName(clubJsonData.getName());
    club.setNameInitials(clubJsonData.getNameInitials());
    club.setDateCreation(clubJsonData.getDateCreation());

    coreClubApplication.updateClub(club);
}

@DELETE
@Path("/club/{clubName}")
public void deleteClub(@PathParam("clubName") String clubName)
        throws ClubException {
    Club club = getClub(clubName);
    coreClubApplication.deleteClub(club);
}

したがって、SoapUI を使用して REST URI をテストする場合、リソース (新しいクラブ) を POST したいのですが、createClub メソッドが 2 回呼び出されます。そして、それを変更したいときは、PUTメソッドの後にPOSTメソッドを自動的に呼び出します。

何か案が ?

ありがとう :)

4

0 に答える 0