在以下之间使用Spring Data JPA关键字时是否有任何区别:
List<SomeEntity> findBySomeCondition();
Run Code Online (Sandbox Code Playgroud)
和
List<SomeEntity> findAllBySomeCondition();
Run Code Online (Sandbox Code Playgroud) Spring 最近关于在Spring Boot项目中使用静态Web内容的博客文章(https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot)表明可以使用几个资源目录:
这要归功于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 boot mvc项目中使用纯java配置如何配置Jackson以省略延迟加载属性
我有一个Spring MVC应用程序,它提供了一个视图,显示了一个Customer实体的所有字段,如名称,地址,电话号码等.应用程序具有各种角色,如ROLE_USER和ROLE_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)
虽然这种方法非常好,但感觉不对,很难测试.我想针对控制器编写测试,控制器使用具有不同角色的主体调用控制器方法,例如testViewCustomerAsRoleAdmin和testViewCustomerAsRoleUser.这是无法验证的,因为控制器将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)以及域类方法(如果存在)上的注释内容的情况.有没有人有做这种事情的经验?
我有这样的情况
@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) 当使用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
spring ×4
java ×3
hibernate ×2
spring-boot ×2
spring-data ×2
spring-mvc ×2
jackson ×1
jetty ×1
jpa ×1
lazyload ×1
maven ×1
mysql ×1
security ×1