小编Rob*_*unt的帖子

Spring Data JPA与findBy/findAllBy的区别

在以下之间使用Spring Data JPA关键字时是否有任何区别:

List<SomeEntity> findBySomeCondition();
Run Code Online (Sandbox Code Playgroud)

List<SomeEntity> findAllBySomeCondition();
Run Code Online (Sandbox Code Playgroud)

java spring spring-data spring-data-jpa

41
推荐指数
2
解决办法
2万
查看次数

带有静态内容的Spring Boot项目在运行jar时会生成404

Spring 最近关于在Spring Boot项目中使用静态Web内容的博客文章(https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot)表明可以使用几个资源目录:

  • / META-INF /资源/
  • /资源/
  • /静态的/
  • /上市/

这要归功于WebMvcAutoConfiguration类,它自动将这些目录添加到类路径中.这一切似乎都很好,并且在使用spring-boot-maven-plugin spring-boot:run目标时似乎有效,所有静态内容都在工作(例如:/index.html).

打包Spring Boot项目并允许spring-boot-maven-plugin创建增强的JAR然后尝试使用java -jar my-spring-boot-project.jar您运行项目时发现您的静态内容现在返回404错误.

spring jetty static-content maven spring-boot

26
推荐指数
2
解决办法
3万
查看次数

配置Jackson以在Spring Boot中省略延迟加载属性

在spring boot mvc项目中使用纯java配置如何配置Jackson以省略延迟加载属性

hibernate jackson spring-boot lazyload

12
推荐指数
3
解决办法
9715
查看次数

Spring Security实体字段级安全性

我有一个Spring MVC应用程序,它提供了一个视图,显示了一个Customer实体的所有字段,如名称,地址,电话号码等.应用程序具有各种角色,如ROLE_USERROLE_ADMIN.用户ROLE_USER只能看到客户名称,用户ROLE_ADMIN可以看到所有客户字段.

目前我实现这一点的方式是使用Thymeleaf视图,该视图利用SpringSecurityDialect根据用户的角色限制对某些字段的访问:

<th:block sec:authorize="hasRole('ROLE_ADMIN')">
  <div th:text="${customer.phoneNumber}" />
</th:block>
Run Code Online (Sandbox Code Playgroud)

虽然这种方法非常好,但感觉不对,很难测试.我想针对控制器编写测试,控制器使用具有不同角色的主体调用控制器方法,例如testViewCustomerAsRoleAdmintestViewCustomerAsRoleUser.这是无法验证的,因为控制器将a返回Customer到完全填充的视图,并且每个字段都可通过getter访问.

我所追求的是实体级别的某种字段级安全性,我可以使用Spring Security注释:

@PreAuthorize("hasRole('ROLE_ADMIN')")
public String getPhoneNumber()
{
  return phoneNumber;
}
Run Code Online (Sandbox Code Playgroud)

AccessDeniedException如果委托人未经授权,那么当试图访问该字段时,这将是理想的.

泽西岛项目似乎有这种被提到的概念在这里,这里和一个例子在这里.但它似乎仅限于基于角色的安全性,而不是提供的完整SpEL支持@PreAuthorize

有没有办法或使用Spring Security实现这种方式,我知道安全上下文或SpEL评估上下文在实体中不可用,因为它们不是Spring管理的.如果没有,是否还有其他方法可以让我实现同样的目标?

编辑:

我不知道内部的Spring Security框架,但似乎可以在ApectJ模式下使用Spring AOP来完成域(实体)类的方法.然后,这将是获取AccessDecisionManager并传递认证(可能从中获得SecurityContextHolder)以及域类方法(如果存在)上的注释内容的情况.有没有人有做这种事情的经验?

java security spring spring-mvc spring-security

7
推荐指数
1
解决办法
4375
查看次数

在 Spring MVC 端点中使用多个 Pageable 参数

我有这样的情况

@Autowired
private CustomerRepository repo;

@RequestMapping("/")
public Page<Customer> getDocuments(@Qualifier("bar") Pageable pageable,
                                   @Qualifier("foo")Pageable pageable2)
{
    return repo.findAll(pageable,pageable2.getOffset(), pageable2.getPageSize());
}
Run Code Online (Sandbox Code Playgroud)

但效果不佳。我的问题是,如何区分参数值。

为了实现上述场景,我不得不将我的方法更改为:

@RequestMapping("/")
public Page<Customer> getDocuments(Pageable pageable,
                                   @RequestParam(value="from", defaultValue="0") int offSet,
                                   @RequestParam(value="length", defaultValue="3") int length)
{
    return repo.findAll(pageable, offSet, length);
}
Run Code Online (Sandbox Code Playgroud)

spring spring-mvc spring-data spring-data-jpa

4
推荐指数
1
解决办法
2417
查看次数

休眠模式验证失败,其中MySQL CHAR映射到String

当使用Hibernate验证程序来验证JPA实体与数据库模式匹配时(通常是setting hibernate.ddl-auto = verify),当它遇到CHAR已映射到String字段的MySQL时,它将失败。

例如,以下MySQL表模式:

CREATE TABLE `item` (
  `id` bigint(20) NOT NULL,
  `name` char(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
);
Run Code Online (Sandbox Code Playgroud)

可以这样映射到JPA实体:

@Entity
public class Item
{
    @Id
    private Long id;

    @Column
    private String name;
}
Run Code Online (Sandbox Code Playgroud)

验证过程将失败,但以下情况除外:

org.hibernate.tool.schema.spi.SchemaManagementException: 模式验证:表[item]的列[name]中遇到的列类型错误;找到[char(Types#CHAR)],但期望[varchar(255)(Types#VARCHAR)]

一个典型的解决方案是@Type在字段上使用Hibernate 批注指定列数据类型,这足以满足验证程序的要求:

@Column
@Type(type = "char")
private String name;
Run Code Online (Sandbox Code Playgroud)

当您实际发出需要将ResultSet映射到实体的查询时,会遇到另一组异常(在这种情况下,使用Spring Data发出查询):

org.springframework.orm.jpa.JpaSystemException:无法通过反射设置字段值[B]值:[class com.example.Item.name] setter of com.example.Item.name; 嵌套异常是org.hibernate.PropertyAccessException:无法通过反射设置字段值[B]值:com.example.Item.name的[class com.example.Item.name]设置程序

java.lang.IllegalArgumentException:无法将java.lang.String字段com.example.Item.name设置为java.lang.Character

java mysql hibernate jpa

3
推荐指数
1
解决办法
2961
查看次数