Веб-сервис Spring RESTFul, использующий Hibernate и JAXB, не может разобрать XML - PullRequest
1 голос
/ 07 июля 2011

Я настроил тестовый веб-сервис Spring, используя одну сущность для моего объекта XML un / marshalling и domain.

Я использую maven со встроенной Jetty и встроенной базой данных H2 только для тестирования службы.

Когда я запускаю POST для создания «Регистрации», я вижу следующую информацию в своей веб-консоли:

Hibernate: вставьте в значения регистрации (id, email, firstName, language, lastName) (null,?,?,?,?)

Как вы можете видеть, поля в объекте являются нулевыми, и поэтому вставка завершается неудачно.

Извините за подробности, но если кто-нибудь сможет ответить на этот вопрос, я думаю, вам нужна вся следующая информация:

весна-context.xml

<bean="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
  <list>
    <ref bean="marshallingHttpMessageConverter"/>
  </list>
</property>
</bean>

<bean id="marshallingHttpMessageConverter"
class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter"
p:marshaller-ref="jaxb" p:unmarshaller-ref="jaxb" />

<oxm:jaxb2-marshaller id="jaxb">
            <oxm:class-to-be-bound name="com.nosh.project.bean.Registration" />
</oxm:jaxb2-marshaller>

<context:component-scan base-package="com.nosh.project.controller" />

<context:component-scan base-package="com.nosh.project" />
<jdbc:embedded-database id="dataSource" type="H2" />

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
p:dataSource-ref="dataSource" p:lobHandler-ref="defaultLobHandler"
p:packagesToScan="com.nosh.project.bean">
<property name="hibernateProperties">
  <value>
    hibernate.dialect=org.hibernate.dialect.H2Dialect
    hibernate.show_sql=true
    hibernate.hbm2ddl.auto=create
  </value>
</property>
</bean>

<bean id="defaultLobHandler"   class="org.springframework.jdbc.support.lob.DefaultLobHandler" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory" />
<tx:annotation-driven proxy-target-class="true"/>

Registration.java (объект и объект XML)

@XmlRootElement(name="registration")
@Entity
public class Registration implements Serializable{
private static final long serialVersionUID = 1L;
private Long id;
private String firstName;
private String lastName;
private String email;
private String language;


public Registration() {

}


@Id
@GeneratedValue
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}
@XmlElement(name = "firstName", required = true)
public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}
@XmlElement(name = "lastName", required = true)
public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

@XmlElement(name = "email", required = true)
public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}


@XmlElement(name = "language", required = true)
public String getLanguage() {
    return language;
}

public void setLanguage(String language) {
    this.language = language;
}

}

Контроллер

@Controller
@RequestMapping("/registration")
@Transactional()
public class RegistrationController {
private RegistrationDao registrationDao;

@Autowired
public void setRegistrationDao(RegistrationDao registrationDao) {
    this.registrationDao = registrationDao;
}

//TODO add inbound object validation to check all required fields are correct.
@RequestMapping(method = RequestMethod.POST)
@Transactional(readOnly = false)
@ResponseStatus(HttpStatus.CREATED)
public @ResponseBody
Registration saveRegistration(Registration registration,
        BindingResult result, HttpServletResponse response) throws BindException {

    if (result.hasErrors()){
        throw new BindException(result);
    }

    registrationDao.saveRegistration(registration);
    response.setHeader("Location", "/Registration/" + registration.getId());
    return registration;
}

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@ResponseBody
public Registration getRegistration(@PathVariable("id") Long registrationId) {

    return registrationDao.getRegistration(registrationId);

}

}

Я посмотрел несколько примеров и не вижу, что мне здесь не хватает. Это как-то связано с тем фактом, что я использую один объект для своей сущности данных и XML unmarshalling?

Большое спасибо

1 Ответ

0 голосов
/ 07 июля 2011

Длинный выстрел здесь, но вам может потребоваться определить supportedMediaTypes для вашего marshallingConverter, а затем убедиться, что клиент отправляет правильный заголовок Content-Type. Вот что я использую ...

<bean id="marshallingConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
    <constructor-arg ref="jaxb" />
    <property name="supportedMediaTypes" value="application/xml"/>
    <property name="marshaller" ref="jaxb" />
    <property name="unmarshaller" ref="jaxb" />
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...