Spring   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何编写一个RestController来从XML请求更新JPA实体,Spring Data JPA方式?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个名为person的数据库

 id | first_name | last_name | date_of_birth 
----|------------|-----------|---------------
 1  | Tin        | Tin       | 2000-10-10    
@H_618_7@

一个名为Person的JPA实体映射到此表:

@Entity
@XmlRootElement(name = "person")
@XmlAccessorType(NONE)
public class Person {

    @Id
    @GeneratedValue
    private Long id;

    @XmlAttribute(name = "id")
    private Long externalId;

    @XmlAttribute(name = "first-name")
    private String firstName;

    @XmlAttribute(name = "last-name")
    private String lastName;

    @XmlAttribute(name = "dob")
    private String dateOfBirth;

    // setters and getters
}
@H_618_7@

该实体还使用JAXB注释进行注释,以允许XML有效负载
要映射到实体实例的http请求.

我想实现一个端点来检索和更新具有给定id的实体.

根据this answer to a similar question,
我需要做的就是实现如下的处理程序方法

@RestController
@requestMapping(
        path = "/persons",consumes = APPLICATION_XML_VALUE,produces = APPLICATION_XML_VALUE
)
public class PersonController {

    private final PersonRepository personRepository;

    @Autowired
    public PersonController(final PersonRepository personRepository) {
        this.personRepository = personRepository;
    }

    @PutMapping(value = "/{person}")
    public Person savePerson(@modelattribute Person person) {
        return personRepository.save(person);
    }

}
@H_618_7@

但是,这不能按预期工作,因为可以通过以下失败的测试用例进行验证:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT)
public class PersonControllerTest {

    @Autowired
    private TestRestTemplate restTemplate;

    private httpHeaders headers;

    @Before
    public void before() {
        headers = new httpHeaders();
        headers.setContentType(APPLICATION_XML);
    }

    // Test fails
    @Test
    @DirtiesContext
    public void testSavePerson() {
        final @R_404_993@404_993@<>@H_618_7@

一个断言失败了:

java.lang.AssertionError: 
Expected: "Tin Tin"
     but: was "Tin"
Expected :Tin Tin
Actual   :Tin
@H_618_7@

换一种说法:

>不会发生服务器端异常(状态代码为200)
> Spring成功加载了id = 1的Person实例
>但其属性不会更新

有什么想法我在这里缺少什么?

注1

here提供的解决方案无效.

笔记2

提供了演示该问题的完整工作代码
here.

更多细节

预期行为:

>加载id = 1的Person实例
>使用Jaxb2RootElementhttpmessageConverter或MappingJackson2XmlhttpmessageConverter使用XML有效内容填充加载的人员实体的属性
>将其作为人员参数传递给控制器​​的动作处理程序

实际行为:

>加载了id = 1的Person实例
>实例的属性未更新以匹配请求有效内容中的XML
>不会更新传递给控制器​​的操作处理程序方法的person实例的属性

最佳答案
这个’@PutMapping(value =“/ {person}”)带来了一些魔力,因为在你的情况下{person}只是’1′,但它碰巧从数据库加载它并放到控制器中的modelattribute.无论你在测试中改变什么(它甚至可能是空的),spring都会从数据库中加载人(有效地忽略你的输入),你可以在第一行控制器上用调试器停止来验证它.

您可以这样使用它:

@PutMapping(value = "/{iD}")
public Person savePerson(@requestBody Person person,@PathVariable("id") Long id ) {
    Person found = personRepository.findOne(id);

    //merge 'found' from database with send person,or just send it with id
    //Person merged..
    return personRepository.save(merged);
   }
@H_618_7@

大佬总结

以上是大佬教程为你收集整理的如何编写一个RestController来从XML请求更新JPA实体,Spring Data JPA方式?全部内容,希望文章能够帮你解决如何编写一个RestController来从XML请求更新JPA实体,Spring Data JPA方式?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。