user2455157
user2455157

Reputation: 147

Spring Data REST - HAL browser - returning HAL browser HTML rather than root of API

I am having a look into Spring Data REST, specifically the HAL browser. I have been following the documentation at http://docs.spring.io/spring-data/rest/docs/current/reference/html/#_the_hal_browser.

When I navigate to http://localhost:8080 it redirects me (as expected) to http://localhost:8080/browser/index.html#/, and the HAL browser is displayed. My issue is, rather than this page displaying details about the root of my API, it is trying to display itself. For example, the Response Body section has the HTML of the HAL browser in it, not JSON from my API.

Screenshot of Response body

I'm not sure if I have done something wrong in my setup - it is pretty vanilla (complete source listing below), so would appreciate any pointers in the right direction!

For completeness - if I enter /users into the Explorer text field and select Go!, then I do see details of my API as expected. Furthermore, if I remove the HAL browser dependency and browse to http://localhost:8080, then I see the root of my API as expected.

Screenshot of response when not using HAL browser

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>sample</groupId>
    <artifactId>restsample</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>My application</name>
    <description>My application description</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-rest-hal-browser</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Application.java

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

User.java

@Data
@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;

    @NotBlank
    @Size(min = 1, max = 100)
    @Column(unique = true)
    private String username;
}

UserRepository.java

@RepositoryRestResource
public interface UserRepository extends CrudRepository<User, Long> {
    User save(User user);
}

Upvotes: 3

Views: 17097

Answers (7)

Billy
Billy

Reputation: 41

Changing the context path in Spring boot really messes spring-data-rest-hal-explorer. Expect /mycontext/explorer/index.html but get 404 instead.

So I remove spring-data-rest-hal-explorer from pom. Then add:

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>hal-explorer</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>webjars-locator</artifactId>
            <version>0.42</version>
        </dependency>

After that I can access hal explorer at: /mycontext/webjars/hal-explorer/index.html

Upvotes: 1

Bablu
Bablu

Reputation: 326

Try changing dependency from

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-rest-hal-browser</artifactId>
</dependency>

to

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-rest-hal-explorer</artifactId>
</dependency>

and then goto: http://localhost:8080

Upvotes: 4

Asif Kamran Malick
Asif Kamran Malick

Reputation: 3181

For future readers: HAL Browser is deprecated in newer versions of Spring Boot as per their Spring-Io GitHub issue.

If you face issues with Hal Browser, please try using the Hal Explorer instead: https://mvnrepository.com/artifact/org.springframework.data/spring-data-rest-hal-explorer

<dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-rest-hal-explorer</artifactId>
</dependency>

More information can be found in this GitHub issue : Spring Boot 2.2 apps should use spring-data-rest-hal-explorer rather than spring-data-rest-hal-browser

Upvotes: 0

shivaspk
shivaspk

Reputation: 610

If you are using Spring 2.2.X please just use with REST HAL browser just go to : http://localhost:8080/ instead of http://localhost:8080/browser.

Thanks

Upvotes: 0

Nallamachu
Nallamachu

Reputation: 1488

As one of the solution suggested in the same page like copy HAL browser files and all. I don't want to make any complexity of that for using REST-HAL-Browser.

I have done a small R&D to know, how to configure REST-HAL-Browser with Springboot application and How to use it? in a simple and easy manner and made steps available to every one. Even returning data, I am getting in the JSON format than the traditional HTML format.

In my application, I used SpringBoot-2.x version and below dependency for REST-HAL-browser.

<dependency>
   <groupId>org.springframework.data</groupId>
   <artifactId>spring-data-rest-hal-browser</artifactId>
</dependency>

Look at hear for how did I configure and Used.

Note: It's better to configure Producer type as application/json along with path, if your method is returning something.

Upvotes: 0

user2455157
user2455157

Reputation: 147

Taking the information from the comments on the original question, the answer is as follows:

a-better-oliver:
If you ask for HTML, then you get HTML

Me:
I should have used "Accept: application/hal+json", which does indeed return the correct data.

Upvotes: 0

user3361807
user3361807

Reputation: 91

A simple solution is to copy the hal-browser files for example from the repo: https://github.com/mikekelly/hal-browser in the

src/main/resources/static/

of your Spring Boot Application.

Upvotes: 0

Related Questions